對於一個正整數,每一次將該數替換爲它每個位置上的數位的平方和,然後重複這個過程直到這個數變爲1,也可能是無限回圈,但始終變不到1.如果可以變爲1,那麼這個數就是快樂數。
思路:如果是快樂數,則很好判斷,回圈計算每次每位數的平方和等於1即可返回true;如果不是快樂數,則要找出退出回圈的條件,否則將會造成死回圈。若不是快樂數,則必定存在一個環,使得回圈無法退出,所以可以使用快慢指針,慢指針每次計算一次,快指針每次計算兩次。如果有環,則快指針一定能追上慢指針,當快指針等於慢指針時,退出回圈,它們是否等於1,等於1則返回true,否則返回false。
int Sum(int n)
{
int sum = 0;
while(n)
{
sum += (n % 10)*(n % 10);
n = n / 10;
}
return sum;
}
bool isHappy(int n)
{
if(1==n||-1==n) return true;
int slow = Sum(n);
if(slow==1) return true;
int fast =Sum(slow);
while(slow!=fast)
{
slow=Sum(slow);
fast=Sum(fast);
fast=Sum(fast);
}
return fast == 1;
}