LeetCode202. 快乐数

按照题目说的规则,不是快乐数的数,会陷入无限循环,永远得不到1,比如18,在第4次迭代的时候计算出来的n是58,在第12次迭代之后n的值还是58,所以就陷入了无限循环之中,所以18不是快乐数。

因此,我们可以用一个set,对于每一次迭代就算出来的n,都先去判断set中是否已经存在这个值了,如果已经存在,说明计算陷入了循环,这个数就不是快乐数。

具体做法:每次循环先把当前n的值加入集合中,方便之后判断循环,每一次计算n的下一次迭代得到的值newN,newN就是把n的所有位置的数的平方和相加得到的数,然后把newN的值再赋给n。
只要n的值不为1(为1就可以返回true了),或者n的值在set中没有出现过,就继续循环。

代码如下:

class Solution {
public:
    bool isHappy(int n) {
        set<int> hash;
        while(true) {
            hash.insert(n);
            int newN = 0;                        //newN是把n的每一位的数的平方和相加得到的数
            while(n != 0) {
                newN += pow(n % 10, 2);
                n /= 10;
            }
            n = newN;                           
            if(n == 1) {                        //退出循环有两种情况:(1)n为1(说明这是一个快乐数)
                break;
            }
            if(hash.count(n) != 0) {            //(2)之前的计算中已经出现了现在这个数,说明陷入了无限循环,这不是一个快乐数
                return false;
            }
        }
        return true;
    }
};
原文地址:https://www.cnblogs.com/linrj/p/13434788.html