- 根据题目的意思可以知道只要中心思路就是对所有元素进行验证卡拉兹,找出没有被其他元素进行覆盖的元素,这些元素就是关键字
#include<stdio.h>
int main()
{
int i,j=0,book[101]={0},n,num[100]={0},t;//num[]用于存储数据元素,book[]用于标记被其他元素覆盖的元素的下标
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
for(i=0;i<n;i++)
{
t=num[i];//令t等于当前数据元素,然后对t进行运算(有个小错误,在刚开始的时候直接对num[i]进行计算了,导致原来的数据元素都变化了,最后输出结果全部错误)
while(t!=1){//当前数据不为1就一直进行运算
if(t%2==0)
t=t/2;
else
t=(3*t+1)/2;
for(j=0;j<n;j++)//遍历整个数据元素,如果有元素与在t的每次计算结果中有相同的,那么就标记相应的book下标为1;
{
if(num[j]==t)
book[j]=1;
}
}
}
for(i=0;i<n;i++)//遍历前n个标记数组book,如果对应下标book标记为1,说明该下标对应num数据元素被其他元素覆盖过,则让该元素=0
{
if(book[i]==1)
{
num[i]=0;
}
}
for(i=0;i<n;i++)//对num数组进行选择排序,让其从大到小进行分布
{
for(j=i+1;j<n;j++)
{
if(num[j]>num[i])
{t=num[i];num[i]=num[j];num[j]=t;}
}
}
for(i=0;num[i]>0;i++)//遍历num数组中不为0的前面的数组进行输出
{
if(num[i+1]!=0)
printf("%d ",num[i]);
else
printf("%d",num[i]);
}
return 0;
}
- 可以简化代码,不用book数组标记,直接让对应的num数组元素=0