输入: 19
输出: true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
代码如下:
bool isHappy(int n) {
unordered_set<int> h;
int nn = n;
int record;
while(nn != 1)
{
int sum = 0; // 每次算完各位求和都要重置sum
while(nn) // 求各位之和
{
int d = nn % 10;
sum += d * d;
nn /= 10;
}
nn = sum; // 更新这个数
if (h.count(nn)) break; // 如果计算结果重复了, 说明死循环
h.insert(nn); // 没有重复就插入
}
return nn == 1; // 可能是nn == 1结束循环, 也可能是break跳出
}
垃圾代码:
bool isHappy(int n)
{
int nn = n;
int record = 0;
while(nn != 1)
{
vector<int> bits;
unsigned digits = 1;
int nums = 0;
// 获得位数
while(digits <= nn)
{
digits *= 10;
nums++;
}
// 获取每一位
digits = 1;
for(int i=0; i<nums; i++)
{
int m = nn/digits%10;
if(m) // 去掉0
{
bits.push_back(m);
}
digits *= 10;
}
// 每位^2之和
int t = 0;
for(int d : bits)
{
t += d*d;
}
nn = t;
// 判断死循环
static bool flag = true;
if(flag)
{
flag = false; // 第一次进来
record = nn;
}
else
{
if(nn == record) return false;
}
}
return true;
}