- 题目地址
- 题目解析:这里我的处理方式有一定简洁性,可供参考。
- 我的代码:
#include<stdio.h>
int main()
{
int n,aa[101]={0};//构建包含下标2-100的数组(输入的数字的范围)记录每次运算的情况
scanf("%d",&n); //0代表未输入且未出现在验证过程中;
for(int i=0,pos;i<n;i++)//1代表关键数;3代表覆盖数;2代表未在输入中但被覆盖了
{
scanf("%d",&pos);
aa[pos]++;
while(pos!=1&&pos<101?aa[pos]<3:1)//这里?:运算是为保证数组不越界
{ //这个算法有个缺陷就是
if(pos%2) //为了节省代码量
pos=3*pos+1; //超过100的数字未记录
if((pos/=2)<101) //运算过程中会重复计算
aa[pos]+=2;
}
}
for(int i=100,mark=0;i>1;i--)
if(aa[i]==1&&mark++==0)
printf("%d",i);
else if(aa[i]==1)
printf("%c%d",' ',i);
return 0;
}