题目:
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
示例 2:
输入:n = 2 输出:false
我们面对这类题有两种解法。
法一:
假设给定一个数m,我们首先要知道各位的数字,然后将它们加起来。再根据快乐数的定义,就可以将本题解决。
int headle(int n)
{
int i;
int s=0;
while(n)
{
i=n%10;
s=s+i*i;
n=n/10;
}
return s;
}
bool isexit(int *s,int n)
{
int i=0;
for(i=0;i<1000;i++)
{
if(s[i]==n)
return ture;
}
return false;
}
bool ishappy(int n)
{
int i=0;
int s[1000];
while(!isexit(s,n))
{
s[i]=n;
i++;
n=headle(n);
}
return n==1;
}
法二:
龟兔赛跑算法。
我们假设兔子与乌龟在同一个起点。乌龟每次走一步,兔子每次走两步。如果兔子与乌龟相遇,那门一定在转圈。如果在数字1处相遇,那门一定是happy number。
int headle(int n)
{
int s=0;
int i;
while(n)
{
i=n%10;
s=s+i*i;
n=n/10;
}
}
bool ishappy(int n)
{
int tru=n;
int rib=n;
do{
tru=headle(tru);
rib=headle(headle(rib));
}while(tru!=rib);
return tru==1;
}