题目截图:
思路:
对输入的每个数字进行验证,并标记已经验证过的数字。最后没有标记的即为所求的关键数。
代码:
1 /* 2 1005. 继续(3n+1)猜想 3 */ 4 5 #include <stdio.h> 6 #include <string.h> 7 #include <math.h> 8 #include <stdlib.h> 9 #include <time.h> 10 11 #define maxn 10001 12 int p[maxn] = {0}; // p[i]=1 表示 i 已验证 13 int v[maxn] = {0}; // 存储输入数据 14 15 // 逆序 16 int cmp(const void* a, const void* b) { 17 return *(int*)b - *(int*)a; 18 } 19 20 int main() { 21 int k, i, n, flag=0; 22 scanf("%d", &k); 23 for(i=0; i<k; ++i) { 24 scanf("%d", &n); 25 v[i] = n; 26 while(n != 1) { // 模拟 3n+1 猜想 27 if(n & 1) { // 奇数 28 n = n*3+1; 29 } 30 n /= 2; 31 p[n] = 1; // 标记为已验证 32 } 33 } 34 qsort(v, k, sizeof(int), cmp); // 逆序排序 35 for(i=0; i<k; ++i) { // 按格式输出 36 if(!p[v[i]]) { 37 if(flag) { 38 printf(" "); 39 } 40 printf("%d", v[i]); 41 flag = 1; 42 } 43 } 44 45 return 0; 46 }