转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907
Problem A:请写一个程序,给出指定整数范围【a ,b】内所有的完数,一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数,例如6是完数,因为6=1+2+3。
输入说明:共一组数据,为两个正整数,分别表示a和b(1<a<b<10^5)。
输出说明:指定范围内的所有完数,每个数占一行。
输入样本
1 100
输出样本
6
28
解答:
/* * 描述: 机试题A解答 * 作者: 张亚超 * 博客: 牟尼的专栏 http://blog.csdn.net/u012027907 * 日期: 2014/7/23 */ #include "stdio.h" int main(){ int a,b; int sum = 0; scanf("%d%d",&a,&b); for(int num = a; num <= b; num++){ sum = num; for(int i = 1; i < num/2+1; i++){ //处理每个数 if(num % i == 0){ //能被i整除 sum -= i; //减去一个因子 } } if(sum == 0){ printf("%d\n",num); //输出完数 } } return 0; }
Problem B:请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。
输入说明:共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。
输出说明:从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
输入样本:
4
15 8 -26
31 24 18 71
-3-9 27 13
17 21 38 69
输出样本:
159 145 144 13581 60 44 32 2827
解答:
#include "stdio.h" #define Max 25 void sort(int store[],int count){ //冒泡排序 for(int i = 0; i < count; i++) for(int j = i+1; j < count; j++){ if(store[i] < store[j]){ int temp = store[i]; store[i] = store[j]; store[j] = temp; } } } void print(int store[],int count){ //打印输出 for(int i = 0; i < count; i++) printf("%d ",store[i]); printf("\n"); } int main(){ int m; int st[10][10],res[Max]; int count = 0; scanf("%d",&m); //统计每行的和 for(int i = 0; i < m; i++){ int sum = 0; for(int j = 0; j < m; j++){ scanf("%d",&st[i][j]); sum += st[i][j]; } res[count++] = sum; } //统计每列的和 for(i = 0; i < m; i++){ int sum = 0; for(int j = 0; j < m; j++){ sum += st[j][i]; } res[count++] = sum; } int sum1,sum2; sum1 = sum2 = 0; for(i = 0; i < m; i++){ //统计主副对角线的和 sum1 += st[i][i]; sum2 += st[i][m-i-1]; } res[count++] = sum1; res[count++] = sum2; sort(res,count); print(res,count); return 0; }
Problem C:对于给定的字符序列,从左至右将所有的数字字符取出拼接成一个无符号整数(字符序列长度小于100,拼接出的整数小于2^31,),计算并输出该整数的最大因子(如果是素数,则其最大因子为自身)
输入说明:有多组数据,输入数据的第一行为一个正整数,表示字符序列的数目,每组数据为一行字符序列。
输出说明:对每个字符序列,取出所得整数的最大因子,若字符序列中没有数字或者找出的整数为0,则输出0,每个整数占一行输出。
输入样本:
3
sdf0ejg3.f?9f
?4afd0s&2d79*(g
abcde
输出样本:
13
857
0
#include "stdio.h" #define Max 100 int maxPrimeFactor(int n) { int i,ans=0; for(i=2;i*i<=n;i++) { while(n%i==0) { ans=i; n/=i; } } if(n>1)ans=n; return ans; } bool isDigit(char ch){ //判断是否是数字 if(ch >= '0' && ch <= '9') return true; else return false; } int main(){ char str[Max][Max],tmp; int res[Max]; int n; scanf("%d",&n); for(int j = 0; j < n; j++){ scanf("%s",str[j]); int sum = 0; int i = 0; res[j] = 0; while(str[j][i] != '\0'){ tmp = str[j][i]; if(isDigit(tmp)){ sum = sum*10 + (tmp - '0'); } i++; } res[j] = maxPrimeFactor(sum); } for(int i = 0; i < n; i++) printf("%d\n",res[i]); return 0; }
Problem D: 已知某二叉树的先序序列和中序序列,编程计算并输出该二叉树的后序序列。
输入说明:仅一组数据,分为两行输入,第一行表示指定二叉树的先序序列,第二行表示该二叉树的中序序列,序列元素均为大写英文字符,表示二叉树的结点。
输出说明:在一行上输出该二叉树的后序序列。
输入样本:
ABDGCEFH
DGBAECHF
输出样本:
GDBEHFCA
#include <stdio.h> #include <string.h> struct Node{ Node *lchild; Node *rchild; char c; }Tree[50]; int loc; Node *creat(){ Tree[loc].lchild = Tree[loc].rchild = NULL; return &Tree[loc++]; } char str1[30],str2[30]; void PostOrder(Node *T){ if(T->lchild != NULL){ PostOrder(T->lchild); } if(T->rchild != NULL){ PostOrder(T->rchild); } printf("%c",T->c); } Node *build(int s1,int e1,int s2,int e2){ Node *ret = creat(); ret->c = str1[s1]; int rootIdx; for(int i = s2; i <= e2; i++){ if(str2[i] == str1[s1]){ rootIdx = i; break; } } if(rootIdx != s2){ ret->lchild = build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1); } if(rootIdx != e2){ ret->rchild = build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2); } return ret; } int main(){ while(scanf("%s",str1) != EOF){ scanf("%s",str2); loc = 0; int L1 = strlen(str1); int L2 = strlen(str2); Node *T = build(0,L1-1,0,L2-1); PostOrder(T); printf("\n"); } return 0; }
Problem E:请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入说明:有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出说明:对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。
输入样本:
4
[(d+f)*{}]
[(2+3))
()}
[4(6]7)9
输出样本:
yes
no
no
no
#include <stdio.h> #include <string.h> #include <stack> using namespace std; #define N 100 int ans[N]; char buf[N][N]; int match(char exp[],int n){ stack<char> s; int i = 0,tag = 1; while(i < n && tag == 1){ if(exp[i] == '(' || exp[i] == '[' || exp[i] == '{'){ s.push(exp[i]); } else if(exp[i] == ')'){ if(s.empty()){ tag = 0; break; } if(s.top() == '('){ s.pop(); } else tag = 0; } else if(exp[i] == ']'){ if(s.empty()){ tag = 0; break; } if(s.top() == '['){ s.pop(); } else tag = 0; } else if(exp[i] == '}'){ if(s.empty()){ tag = 0; break; } if(s.top() == '{'){ s.pop(); } else tag = 0; } i++; } if(s.empty() == false) tag = 0; return tag; } int main(){ int n; while(scanf("%d",&n) != EOF){ for(int i = 0; i < n; i++) scanf("%s",buf[i]); int cnt = 0; for(i = 0; i < n; i++){ int len = strlen(buf[i]); if(match(buf[i],len)) ans[cnt++] = 1; else ans[cnt++] = 0; } for(i = 0; i < cnt; i++) if(ans[i]) printf("yes\n"); else printf("no\n"); } return 0; }