编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19 输出: true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 第一次写的时候没想到跳出循环的条件,总想着如果一个数本身的结果就应该是false,那么这不就成为一个死循环了吗?
- 搜了一下解法发现是用集合set<>来写出循环的跳出条件,又学到了,又学到了。。。。。
- 当set<>中已经存在相同的数值时说明在这个数和在这个数的两次出现之间的数就构成了一次循环,下面就只会是循环这些数字,这是就要return false 了。
AC:
class Solution {
public:
bool isHappy(int n) {
set<int>res;
int k,ans;
ans=n;
while(1)
{
k=ans,ans=0;
while(k!=0)
{
ans=(k%10)*(k%10)+ans;
k=k/10;
}
if (ans==1)
return true;
if (res.count(ans)==1)
return false;
else
res.insert(ans);
}
}
};