题目链接
解题思路
按照题目描述,如果一个数是快乐数那么很好办,因为不管怎样,经过有限次运算都能得到答案,但是如果该数不是快乐数,那么看起来似乎没有办法自证,因为永远也算不到无限;但是这样的推论忽略了一个条件:快乐数本身的范围是有限的。按照输入数据小于的数据规模,估算最大输入, 即一个11位数,那么也就是说任何输入最多只有10位,即使这10位都是9,那么通过位数分别平方再求和的运算方法,经过有限次运算后,得到的中间变量x一定满足。根据抽屉原理,在此之后,最多计算810次,就能得到重复的数。而如果出现重复的数且周期里面没有1,那么该数就不是快乐数。
关键步骤如下:
1.封装计算函数,来对新的中间变量取各位平方之和。
int cal(int n)
{
int output = 0;
while(n > 0)
{
int temp;
temp = n % 10;
output += temp * temp;
n = n / 10;
}
return output;
}
2.创建大小为811的hashset,数据类型为bool。如果中间变量取到temp,那么将hashset[temp]标记为1,如果hashset[temp]已经标记为1且temp != 1,那么说明不是快乐数。
int temp = n;
for(int i = 0; i < 1000; i++)
{
temp = cal(temp);
if(temp == 1)
break;
if(hashset[temp] == 0)
hashset[temp] = 1;
else
return false;
}
return true;
完整代码
#include <iostream>
using namespace std;
class Solution {
public:
int cal(int n)//
{
int output = 0;
while(n > 0)
{
int temp;
temp = n % 10;
output += temp * temp;
n = n / 10;
}
return output;
}
bool isHappy(int n)
{
bool hashset[811] = {0};//
int temp = n;
for(int i = 0; i < 1000; i++)
{
temp = cal(temp);
if(temp == 1)
break;
if(hashset[temp] == 0)
hashset[temp] = 1;
else
return false;
}
return true;
}
};
int main()
{
Solution sol;
int n = 2;
bool output = sol.isHappy(n);
cout << output << endl;
return 0;
}