C語言 判斷快樂數

2020-08-14 21:08:16

  對於一個正整數,每一次將該數替換爲它每個位置上的數位的平方和,然後重複這個過程直到這個數變爲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;
}