题目是1001(3n+1)猜想的延续问题,利用猜想来判断后面的数字以及猜想结果能否覆盖前面的数字及前面的结果。
从结果分析,使用数组下标表示数字,用整型数组存个数,输入的数字在原基础上加1,只要有覆盖就减1,可以减到负数,这说明覆盖的多,最后输出的时候只要输出没有被覆盖的数(即数组中存的数为1 的数组下标)。
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[10001] = {0};
for(int i = 0; i < n; i++) {
int num;
cin >> num;
a[num]++;
while(num != 1) {
if(num % 2 == 0) {
num = num / 2;
} else {
num = (num * 3 + 1) / 2;
}
a[num]--;
}
}
bool flag = false;
for(int i = 100; i >= 0; i--) {
if(a[i] == 1) {
if(!flag) {
flag = true;
} else {
cout << " ";
}
cout << i;
}
}
return 0;
}
刚开始做的时候不懂题的意思,以为是只比较他们的(3n+1)猜想的延伸数字,所以没有把输入的数字本身算上。