使用集合来做快乐数

这题归类于新手入门120里的集合篇了,但我翻题解发现,用cpp的除了哈希就是双指针,于是自己上手试试,做这题做一半思路就断了,向神秘力量借了点东西,才知道原来是不知道快乐数的定义导致的;

快乐数:如果数字不能变为1,则会进入一个不包含1的循环。例如,2不是快乐数,它会进入循环:2→4→16→37→58→89→145→42→20→4→...(在4处开始循环);

这里我们用集合的话,可以使用一个集合来记录已经出现过的数字,如果某个数字重复出现,说明进入了循环,那么这个数就不是快乐数。如果计算过程中得到了1,那么就是快乐数。 (虽然我一开始在用if写石山)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return bool布尔型
     */
    bool happynum(int n) {
        // write code here

        // 使用集合记录已经出现过的数字
        multiset<int> s;
        while (n != 1)
        {
            // 如果当前数字已经出现过,说明进入了循环,不是快乐数
            if (s.count(n))
            {
                return false;
            }
            //未出现,记录当前数字
            s.insert(n);

            //计算各位数字平方和
            int sum = 0;
            int temp = n;
            while (temp != 0)
            {
                int digit = temp % 10;
                sum += digit * digit;
                temp /= 10;
            }
            n = sum; //更新n的值
        }
        //如果n==1,跳出循环
        return true;
    }
};