Lintcode快乐数问题解析

来源:互联网 发布:西安软件新城公寓 编辑:程序博客网 时间:2024/06/05 06:17

两种实现:

第一种:

bool isHappy(int n) {
        // Write your code here
        if (n < 1)
            return false;
        if (n == 1)
            return true;
        unordered_set<int> showedNums;
        showedNums.insert(n);


        while (true) {
            int s = 0;
            while (n) {
                s += (n % 10) * (n % 10);
                n = n / 10;
            }
            //此处如此设计应该包含着这样一层逻辑关系,最后不管是什么数都会陷入无限循环,如果是1的话,就返回TRUE;否则,一直再循环,循环的过程中中间数肯定会重复出现,如果在循环过程中找到了那个中间数,就返回false了。
            if (s == 1)
                return true;
                //如果找到了指定的值,则返回元素的迭代器;如果未在容器中找到,则返回unordered_set :: end。
            else if (showedNums.find(s) != showedNums.end())//显然是没找到不进入条件,没找到是end,end=end,不进循环,找到了才进循环呀
                return false;
            n = s;
            showedNums.insert(s);
        }
    }


第二种:

首先说明一个真命题:任意一个正整数数运用题目中的算法都会循环到1或者89,若循环到1那就是快乐数,若循环到89,就是非快乐数,且循环到这两个数的时候都会陷入死循环。其实对于false情况来说,出现了循环过程中任何一个中间数,那么即可以断定这是一个false的情况了。详情见上一种实现。所以这个题只需要判断题目中的算法最后将给的数循环到了1还是89即可。先写一个sum函数用来拟合题目中的算法,然后再主函数中写一个循环语句,当循环到1或89时停止即可。
int sum(int a){
        int temp=a;
        int ans=0;
        while(temp!=0){
            ans+=(temp%10)*(temp%10);
            temp/=10;
        }
        return ans;
    } 
    bool isHappy(int n) {
        // write your code here
        if(n==1)
        return true;
        if(n<1)
        return false;
        int s=n;
        while(s!=1&&s!=89){
            s=sum(s);
            if(s==1)
            return true;
            if(s==89)
            return false;
        }
    }

原创粉丝点击