1005 继续(3n+1)猜想
Statement
Metadata
- 作者: CHEN, Yue
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 400 ms
- 内存限制: 64 MB
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数
输出格式
每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。
输入样例
输出样例
Solution
#include <bits/stdc++.h>
using namespace std;
#define MAXN 105
int a[MAXN] = {0}, b[MAXN], c[MAXN];
void f(int x) {
for (; x != 1;) {
if (x % 2) {
x = 3 * x + 1;
x /= 2;
if (x <= 100)
a[x] = 0;
} else {
x /= 2;
if (x <= 100)
a[x] = 0;
}
}
}
int comp(int x, int y) {
return x > y;
}
int main() {
int n, i, j, num;
cin >> n;
for (i = 0; i < n; i++) {
scanf("%d", &b[i]);
a[b[i]] = 1;
}
for (i = 0; i < n; i++) f(b[i]);
for (i = 0, j = 0; i < MAXN; i++) {
if (a[i])
c[j++] = i;
}
sort(c, c + j, comp);
printf("%d", c[0]);
for (i = 1; i < j; i++) printf(" %d", c[i]);
cout << "\n";
}
Last update: May 4, 2022