最后一个测试点错误,后期回头再看吧。
这个输出方式简直精妙
printf("%d%s",i,--cnt?" ":"");
利用一个比较和–cnt来区别最后一位。
#include <stdio.h>
int main(){
int cnt = 0, number = 0;
int a[101] = {0};
scanf("%d", &cnt); // 读取所有的整数个数
// 将数组中序号为所输入整数的位置的数值标记为1
for(int i = 0; i < cnt; i++){
scanf("%d", &number);
a[number] = 1;
}
// 对数组从1开始进行遍历
for(int i = 1; i < 101; i++){
if(a[i] == 1){ // 数值为1的序号为输入整数
// 对i进行判断处理i
for(int j = i; j > 1 && j < 101;){
if(j % 2 == 0){
j /= 2;
}
else{
j = (j*3 + 1) / 2 ;
}
if(j > 100){
break;
}
if(a[j] == 1){
a[j] = 0; //检查覆盖,若覆盖,将该序号对应数值标记为0;
cnt--;
}
}
}
}
//再次遍历,寻找数组中数值为1的序号,即为关键数,进行输出
for(int i = 100; i > 1; i--){
if(a[i] == 1){
printf("%d%s",i,--cnt?" ":""); // 非常好的输出方式
}
}
return 0;
}