(3n+1)猜想:
题目描述:
样例:
思路:用一个数组来标记输入的数据,将其值置为1,再逐个排查,最后倒序输出值为1的索引即可。
#include <stdio.h>
int main()
{
int K=0;
scanf("%d",&K);
//输入数据,标记;
int number;
int i=0;
int flag[101]={0};//标记数据出现与否;
for(;i<K;i++){
scanf("%d",&number);
flag[number]=1;
}
//排查;
int j=0;
for(i=1;i<=100;i++){//对每个已记录的数进行操作;
if(flag[i])
//找到每个数覆盖的数;
for(j=i;j>1;){
if(j%2) j=(3*j+1)/2;
else j=j/2;
//在已记录数据中排除;
if(j<=100 && flag[j]){
flag[j]=0;
K--;
}
}
}
//打印剩余数据;
for(i=100;i>=1;i--){
if(flag[i])
printf("%d%c",i,--K ? ' ' : '\n');
}
return 0;
}
/*总结反思:
标记一个东西,可以引入一个变量,用0或者1来表示状态,类似二进制;
标记一群东西,可以引入一个数组,索引表示某个变量,数组值设为0或1。*/