hummmmm这个题和上次(3n+1) 猜想,多了个检测,然后找出不能覆盖的数字,并且按从大到小的顺序输出。
我的思路是:先将带检测数组按从大到小排序,然后依次验证,验证过程中,被计算的数字有一个hash数组记录次数,最后再从尾部开始遍历(保证输出结果降序)依次hash数组,次数为1的即为所求。
当然这里hash的最大值不容易确定,我改到10000才AC。
条条大路通罗马呀,我这道题在半年前做的了,现在的做法和之前有很大不同,代码也简练了些许,所以慢慢积累啦,我相信以后再回过头来重做一遍时,又会有很大不同。
#include <stdio.h>
#define maxSize 1000 //note me
int checked[maxSize]; // global checked array
void checkNum(int x,int checked[])
{
if(x>1)
{
checked[x]++;
if(x%2==0) checkNum(x/2,checked);
else checkNum((3*x+1)/2,checked);
}
}
int main()
{
int n,i,toCheck[maxSize],inCheck[maxSize],sflag;
/*initialize the checked array and inCheck array*/
for(i=0;i<maxSize;i++)
checked[i]=inCheck[i]=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&toCheck[i]);
inCheck[toCheck[i]]=1;
}
for(i=0;i<n;i++)
{
/*check*/
checkNum(toCheck[i],checked);
}
sflag=0; //space flag
for(i=maxSize-1;i>0;i--)
{
if(inCheck[i]&&checked[i]==1)
{
/*checked once*/
if(!sflag)
{
printf("%d",i);
sflag=1;
}
else printf(" %d",i);
}
}
return 0;
}