PAT Basic 1005. 继续(3n+1)猜想 in C.


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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值