厦门大学考研上机真题
来自于:王道论坛-2017厦大计算机专硕复试题
判断回文数字
第一题判断一个整数是否为回文数,例如123321
1 #include2 3 // 判断是否为回文数列 4 int main() 5 { 6 int num, huiwei, temp; 7 while(scanf("%d", &num) != EOF) 8 { 9 temp = num; 10 huiwei = 0; 11 while(temp > 0) 12 { 13 huiwei = huiwei * 10 + (temp % 10); 14 temp = temp / 10; 15 } 16 if(huiwei == num) 17 printf("Yes\n"); 18 else 19 printf("No\n"); 20 } 21 }
第二题求a-b之间的非素数个数,用最小的代价。
1 #include2 #include 3 4 // a-b之间的非素数个数,用最小的代价 5 6 int isPrime(int n) 7 { 8 int i; 9 int flag = 1; 10 int m = (int)sqrt(n) + 1; 11 if(n < 2) flag = 0; 12 for(i = 2; i < m; i++) 13 { 14 if(n % i == 0) 15 { 16 flag = 0; 17 break; 18 } 19 } 20 return flag; 21 } 22 23 24 int main() 25 { 26 int a, b; 27 int i, count = 0; 28 while(scanf("%d %d", &a, &b) != EOF) 29 { 30 for(i = a; i <= b; i++) 31 { 32 if(isPrime(i) == 0) //not prime 33 count++; 34 } 35 printf("%d", count); 36 } 37 return 0; 38 }
第三题16进制不进位的加法,输入要考虑大小写的不同,输出只要大写。
这个题不知道什么意思,暂时没做
最大子串和.c
求一个整型数组,所有子串中元素和最大的子串,输出和是多少,子串是什么。比如 {1,2,3,4,5,-1,-2}最大子串是{1,2,3,4,5},和是15。
这个题目好像是求最大子数列和问题。并给出最大数列
1 #include2 3 int main() 4 { 5 int n, num[1001], i; 6 int maxSum = 0, subSum = 0; 7 int start, t, end; 8 scanf("%d", &n); 9 for(i = 0; i < n; i++) 10 { 11 scanf("%d", &num[i]); 12 } 13 14 for(i = 0; i < n; i++) 15 { 16 subSum += num[i]; 17 if(subSum < 0) 18 { 19 subSum = 0; 20 t = i + 1; 21 } 22 if(subSum > maxSum) 23 { 24 maxSum = subSum; 25 start = t; 26 end = i; 27 } 28 } 29 printf("%d\n", maxSum); 30 for(i = start; i <= end; i++) 31 printf("%d ", num[i]); 32 return 0; 33 }
运行结果如下
第一行输入 数列个数
第二行 输入 数列
第三行 输出最大子数列和
第四行 输出最大和的数列
求出现的最多的次数
1 #include2 // 大概的思路就是定义两个数组,一个用于存储数字,另一个用于存该数字 3 // 出现的次数 4 5 int main() 6 { 7 int n[101], count[101] = {0}; 8 int num, i, j, max = 0, max_index; 9 scanf("%d", &num); 10 for(i = 0; i < num; i++) 11 { 12 scanf("%d", &n[i]); 13 count[i] += 1; 14 } 15 16 for(i = 0; i < num; i++) 17 { 18 for(j = i+1; j < num; j++) 19 if(n[i] == n[j]) 20 count[i] ++; 21 } 22 // find max 23 for(i = 0; i < num; i++) 24 { 25 if(count[i] > max) 26 { 27 max = count[i]; 28 max_index = i; 29 } 30 } 31 32 printf("%d\n", n[max_index]); 33 return 0; 34 }
运行结果
第一行输入个数
第二行输入数字
第三行输出出现最多的数字
快速排序
快速排序主要是把树上的代码看了遍,自己理解了一下,然后自己默写下来
1 #include2 3 int qk_pass(int n[], int low, int high) 4 { 5 int x = n[low]; 6 while(low < high) 7 { 8 while(low < high && x <= n[high]) //hign 从右往左找比x小的值 9 high--; 10 if(low < high) // 找到了x > n[hight]的情况 11 { 12 n[low] = n[high]; 13 low++; 14 } 15 while(low < high && x >= n[low]) 16 low++; 17 if(low < high) 18 { 19 n[high] = n[low]; 20 high --; 21 } 22 } 23 n[low] = x; 24 return low; 25 } 26 27 void quick_sort(int n[], int low, int high) 28 { 29 int pos = 0; 30 if(low < high) 31 { 32 pos = qk_pass(n, low, high); 33 quick_sort(n, low, pos-1); 34 quick_sort(n, pos+1, high); 35 } 36 } 37 38 int main() 39 { 40 int n[101], num, i; 41 scanf("%d", &num); 42 // input 43 for(i = 0; i < num; i++) 44 { 45 scanf("%d", &n[i]); 46 } 47 // quick sort 48 quick_sort(n, 0, num-1); 49 // output 50 for(i = 0; i < num; i++) 51 { 52 printf("%d ", n[i]); 53 } 54 return 0; 55 }
运行结果如下:
第一行输入元素的个数
第二行输入数组元素
第三行输入排序后的结果