编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,那么这个数就是快乐数。如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
示例 2:
输入:n = 2
输出:false
提示:
1 <= n <= 231 - 1
解题思路1:通过去余数的方式,余数平方累加后,把结果进行递归调用。
int next_n(int n)
{
int r=0;
while(n!=0)
{
int d=n%10;
n/=10;
r+=d*d;
}
return r;
}
bool contains(int * history,int size,int n)//检查n是否出现过
{
for(int i=0;i<size;i++)
{
if(history[i]==n)
{
return ture;
}
}
return false;
}
bool isHappy(int n){
int history[1000000];
int size=0;
while(!contains(history, size, n))
{
history[size]=n;
size++;
n=next_n(n);
}
return n==1;
}
解题思路2:龟兔赛跑算法
int next_n(int n)
{
int r=0;
while(n!=0)
{
int d=n%10;
n/=10;
r+=d*d;
}
return r;
}
bool isHappy(int n){
int slow;
int fast;
do
{
slow=next_n(slow);
fast=next_n(next_n(fast));
}while(slow!=fast);
return n==1;
}