題目如下:
編寫乙個演算法來判斷乙個數 n 是不是快樂數。
「快樂數」定義為:對於乙個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為 1,也可能是 無限迴圈 但始終變不到 1。如果 可以變為 1,那麼這個數就是快樂數。
如果 n 是快樂數就返回 true ;不是,則返回 false 。
示例:
輸入:19
輸出:true
解釋:1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
使用快慢指標的方法來進行判斷
為什麼要使用快慢指標呢?
1、快慢指標是快指標走兩步,慢指標走一步,假如有環的話,那麼快慢指標一定會在某乙個位置相遇的,所以快慢指標經常使用來判斷鍊錶中是否存在環的情況,假如沒有環快指標與慢指標是無法相遇在某個位置的。
2、對於這道題目來說,快指標走兩步,也就是計算兩次平方和,慢指標走一次計算一次平方和,假如輸入的數字是快樂數,那麼一定是不存在環的,無環的情況下,快指標的結果最後一定是到達最終的數字1的(怎麼樣計算都是1),這個時候當慢指標追上快指標的時候一定會相遇在1,這個時候判斷迴圈退出之後兩個相遇的位置是否是1,即可判斷是否是快樂數。
3、當不是快樂數的時候,快慢指標也會相遇,因為怎麼樣平方計算都不會到達1,因為這中間存在著重複的數字而且是永遠到達不了1的,所以存在環,兩者一定會在某乙個位置上相遇並且相遇的位置一定不是1,所以可以判斷其不是快樂數。
**如下:
#include
intfunc
(int x)
return sum;}(
int n)
//判斷是否是快樂數
while
(fast != slow)
;return slow ==1;
}int
main()
執行截圖如下: 編寫乙個演算法判斷乙個數是不是「快樂數」。
乙個 快樂數 的定義為 對於乙個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為1,也可能是無限迴圈但始終變不到1.如果可以變為1,那麼這個數就是快樂數。例項 輸入 19 輸出 true 解釋 1 2 9 2 82 8 2 2 2 68 6 2 8 2 100 1...
LintCode判斷乙個數是不是回文數
判斷乙個數是不是回文數 我的想法是先將數字變成陣列,然後設定兩個指標分別從開頭和末尾一一比對.話不多說,如下 package com.yangshunfan.lintcode 判斷乙個數是不是回文數 public class huiwenshu 設定兩個指標 int left 0 int right...
如何判斷乙個數是不是完全平方數
在不使用浮點函式sqrt的情況下,我們有一些比較好的演算法 1.利用恒等式 1 3 5 7 2 n 1 n 2 bool issqrt intn 下面是一些關於完全平方數的數學性質 對排除完全平方數有一定的加速作用 性質1 完全平方數的末位數只能是0,1,4,5,6,9。性質2 奇數的平方的個位數字...