//利用int的最低两位作为标记位:
//nums[i]&2为真,表示i为输入序列,
//nums[i]&1为真,表示i未被覆盖。
//循环里对每个未被覆盖的数进行3n+1计算,
//并更新序列中数的状态。
#include<stdio.h>
int main(){
int nums[101]={};
int n,tmp,num,i;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&tmp);
nums[tmp]=3;
}
for(i=2;i<=100;i++){
if(nums[i]==3){
tmp=i;
while(tmp!=1){
if(tmp&1) tmp=tmp*3+1;
tmp>>=1;
if(tmp<=100){
if(nums[tmp]==1) break;
if(nums[tmp]==3){
nums[tmp]&=1;
n--;
}
}
}
}
}
for(i=100;i>1;i--){
if(nums[i]==3){
printf("%d",i);
n--;
if(n) putchar(' ');
}
}
return 0;
}
PAT(Basic Level)_1005_继续(3n+1)猜想
最新推荐文章于 2019-03-31 21:14:56 发布