思路:
第一个点就是求该数各位平方和,第二个就是考虑如何判断是否出现循环,即当前平方和是否曾经出现过,考虑用哈希表
第二步需要考虑哈希表的长度,题目中给出的n的范围可知,最长是32位,最大数是32位全1,那么平方和最大就是31位9,最大和是2511,所以可以设置数组长度为2512,用于记录平方和是否出现过,从而判断是否循环
c
//SquareSum用于求该数平方和
int SquareSum(int a)
{
int tmp=a;
int sum=0;
while(tmp!=0)
{
int k=tmp%10;
sum+=k*k;
tmp/=10;
}
return sum;
}
bool isHappy(int n)
{
//定义一个哈希表用于记录当前出现过的数
int hash[2512]={0};
while(n!=1)
{
int tmp=SquareSum(n);
if(hash[tmp]==1) return false;
if(hash[tmp]==0) hash[tmp]=1;
n=tmp;
}
return true;
}