编写一个算法来判断一个数是不是 “快乐数”。
一个 “快乐数” 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
第一种写法
int next_n(int n)//下一次的n运算
{
int r = 0;
while(n != 0)
{
int d = n % 10;
n /= 10;
r += d *d;
}
return r;
}
bool contain(int *history ,int size,int n)//检查n是否在history中出现过
{
for(int i = 0; i <size;i++)
{
if(history[i] == n)
{
return true;
}
}
return false;
}
bool isHappy(int n)
{
int history[10000];//去过哪里
int size = 0;//总共去过那个地方
while(!contain(history,size,n))
{
history[size] = n;
size++;
n = next_n(n);
}
return n == 1;
}
第二种写法
int next_n(int n)
{
int r = 0;
while(n != 0)
{
int d = n % 10;
n /= 10;
r += d *d;
}
return r;
}
bool contain(int *history ,int size,int n)
{
for(int i = 0; i <size;i++)
{
if(history[i] == n)
{
return true;
}
}
return false;
}
bool isHappy(int n)
{
int slow = n;
int fast = n;
do
{
slow = next_n(slow);
fast = next_n(next_n(fast));
}while(slow != fast);
return fast == 1;
}