1005. 继续(3n+1)猜想

题目截图:

1005. 继续(3n+1)猜想

思路:

对输入的每个数字进行验证,并标记已经验证过的数字。最后没有标记的即为所求的关键数。

代码:

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 }