關於快樂數的一個猜想

有一段時間沒寫博客了,今天看到快樂數,突然想起很久之前的一個猜想,就又翻了出來。

快樂數的特性是什麼?該數字所有數位的平方和,得到的新數再次求所有數字的平方和,如此重複進行,最終結果一定爲1。而我們知道,INT_MAX是21_4748_3647。如果想讓次數儘可能多,那直覺應該是讓所有數位的平方和最大。在INT_MAX的範圍內,數位平方和最大的數字應該是19_9999_9999,而這個數的數位平方和是729。

這意味着什麼?在INT_MAX的範圍內,所有數字的數位平方和都不會超過這個數,也就意味着經過一次轉換之後,INT_MAX範圍內的所有快樂數都應該出現在729以內。在這個範圍內的快樂數有(來自維基百科):

1, 7, 10, 13, 19, 23, 28, 31, 32, 44, 49, 68, 70, 79, 82, 86, 91, 94, 97, 100, 103, 109, 129, 130, 133, 139, 167, 176, 188, 190, 192, 193, 203, 208, 219, 226, 230, 236, 239, 262, 263, 280, 291, 293, 301, 302, 310, 313, 319, 320, 326, 329, 331, 338, 356, 362, 365, 367, 368, 376, 379, 383, 386, 391, 392, 397, 404, 409, 440, 446, 464, 469, 478, 487, 490, 496, 536, 556, 563, 565, 566, 608, 617, 622, 623, 632, 635, 637, 638, 644, 649, 653, 655, 656, 665, 671, 673, 680, 683, 694, 700, 709, 716。

而這些快樂數“收斂”到1最多只需要10步(565和655)。所以,我猜想,INT_MAX以內的所有快樂數最多只需要11步就會收斂到1。由此,11次循環之後仍然沒有收斂到1的數字一定不是快樂數。

bool isHappy(int n)
{
    int N = 11;
    while (N)
    {
        int new_n = 0;
        while (n > 0)
        {
            new_n += pow(n % 10, 2);
            n /= 10;
        }
        if (new_n == 1)
        {
            return true;
        }
        n = new_n;
        --N;
    }
    return false;
}

當然這只是一個猜想。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章