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 }