閑話系列:每日一題,禿頭有我,Hello!!!!!,我是IF‘Maxue,歡迎大佬們來參觀我寫的藍橋杯系列,我好久沒有更新博客了,因為up豬我寒假用自己的勞動換了臺新電腦,沒用父母的錢哦!!!,雖然進度慢了,但是值得,藍橋杯快開始了,所以我也開始努力起來了。同時,我也歡迎各位大佬互三,看到我會及時回復的!!!
放一張阿刃在這,除大家的霉運
文章目錄
- 題目解析
- 算法原理解析
- 具體解法
- 代碼實現
題目解析
- 搞懂定義
對于一個正整數,每一次替換為它每個位置上的平方和。
舉例:
- 19這個數字經過處理可以變成1,2這個數字變成了無限循環,
- 所以19是快樂數字,2就不是
- 判斷最后的那一個環是否都是一
算法原理解析
我們仔細觀察,在最后的結尾,
-
為快樂數的數字最后的結尾都是1,我們可以理解成一個園環。
-
非快樂數的數字最后結尾我們知道,肯定不是1,但是因為鴿巢原理我們會得出結論肯定成環。(不知道也沒關系,下面有詳細解析)
-
原理如圖所示,上面的是快樂數,下面的數是非快樂數:
-
判斷最后的環的數字是否都是1.
具體解法
- 解法 快慢雙指針。
- 定義快慢指針
> - 慢指針每次后移一步,快指針每次后移兩步 讓慢指針一次進行一次操作,讓快指針進行2次快樂數操作
- 判斷相遇的值
- 直接判斷相遇的值
- 鴿巢原理詳解:
- 我們可是讓慢指針執行一次,然后對于快指針每一次后移進行執行快樂數的兩次操作
-
為什么這些數字不會一直鋪開,為什么一定要成環?
證明原理:鴿巢原理 -
如果有n個巢,n+1個鴿子可以推論
-
證明這道題:
-
一個數字2.1 * 10^9
-
我們已經知道n個巢穴,n+1個鴿子,如果鴿子全部歸位,至少有一個巢穴里面的鴿子大于1.
-
我們拿出9999999999這個數字,進行快樂數操作,
-
范圍將會鎖定在【1,810(9^2 * 10)】(這個就是巢穴),我們進行811次快樂數字操作(這個就是鴿子)
-
-
- 我們可是讓慢指針執行一次,然后對于快指針每一次后移進行執行快樂數的兩次操作
代碼實現
int HappyC(int n)//快樂數的操作{ int x=0;int sum=0;while(n){x=n%10;sum=x*x+sum;n=n/10;}return sum;}bool isHappy(int n) {//定義兩個快慢指針,用數字代替int fast=0;int slow=0;slow=n,fast=n;while(1){fast=HappyC(fast);fast=HappyC(fast);slow=HappyC(slow);if(fast==slow){if(fast==1){return true;}else{return false;}}}}
運行結果展示: