uva10591 - Happy Number(快乐的数)

题意,给出一个数字,判断它是否是Happy Numer。

条件:

 对给出的数字S0的每一位求平方和,得到下一个数字S1,再次对得到的数字S1的每一位求平方和,若出现Sn=1情况,则原始数字是Happy Number,否则就Unhappy Number。

这个题的技巧在于循环结束的条件,

开始的时候我认为某一个状态等于1或者该数字在前面出现过是结束的标志。

写个一个数组判重,结果程序跑了1s多,

看到人家的代码只有8ms,我顿时有感觉自己弱爆了,,,

其实我们不难发现,10以内只有1,7符合条件,所以我们可以判断若某一状态到了10以内切该数字不是1或者7的话,就不可能是Unhappy Number了,所以这也可成为一个结束标志。

代码如下;

#include <cstdio>
int return_value(int s)
{
    int temp, tt = 0;
    while(1)
    {
        if(s==0) break;
        temp = s%10;
        s /= 10;
        tt+=(temp*temp);
    }
    return tt;
}
int main ()
{
    int st, t, ok, init;
    scanf("%d",&t);
    for(int i = 1; i <= t; i++)
    {
        ok = 0;
        scanf("%d",&st);init = st;
        while(1)
        {
            if(st==1||st==7) { ok = 1; break;}
            if(st<10) break;
            st = return_value(st);
        }
        if(ok) printf("Case #%d: %d is a Happy number.\n",i, init);
        else printf("Case #%d: %d is an Unhappy number.\n",i, init);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值