解题思路:因为不知道如何去终止循环,所以看了一下讨论区的方法,一种是根据规律来终止循环,在维基百科上给出了一个"开心数字"的序列,1,7,...所以当发现n<7时,就可以终止循环了,一定不是"开心数字";第二种方法找上限,32位int类型的取值范围 min:-2147483648 max:2147483647,而根据"开心数字"的规则,最大的应该是每位都是9,这样最大才810,假设10位全是9,其实并没有那么大,所以可以开一个1000的数组,用来记录这个数组是否出现过,如果出现过说明进入死循环了,可以跳出来了.
class Solution {
public:
bool isHappy(int n) {
int count = 0;
while(n > 6){
int res = 0;
while(n != 0){
res += (n%10)*(n%10);
n /= 10;
}
n = res;
}
return n == 1;
}
};
class Solution {
public:
int res(int n){
int ans = 0;
while(n){
ans += pow(n%10, 2);
n/=10;
}
return ans;
}
bool isHappy(int n) {
bool flag[1000];
memset(flag, 0, sizeof(flag));
n = res(n);
while(!res[n]){
res[n] = true;
if(n == 1)
return true;
n = res(n);
}
return false;
}
};