1、問題描述:
任意給定一個正整數 N,
如果是偶數,執行: N / 2
如果是奇數,執行: N * 3 + 1
生成的新的數字再執行同樣的動作,循環往復。
通過觀察發現,這個數字會一會兒上升到很高,
一會兒又降落下來。
就這樣起起落落的,但最終必會落到“1”
這有點像小冰雹粒子在冰雹雲中翻滾增長的樣子。
比如N=9
9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
可以看到,N=9的時候,這個“小冰雹”最高衝到了52這個高度。
輸入格式:
一個正整數N(N<1000000)
輸出格式:
一個正整數,表示不大於N的數字,經過冰雹數變換過程中,最高衝到了多少。
例如,輸入:
10
程序應該輸出:
52
再例如,輸入:
100
程序應該輸出:
9232
2、我對這個問題的看法
題目要求我們編寫代碼實現小於N的所有整數在按照特定規則下不斷變化的過程中,設法找到它們的峯值(最大值),並在這些峯值中找到它們中的最大值。
3、我的解題思路
(1)首先,定義一個計算冰雹數的函數calculate();在函數中,先定義有關的變量max、fin、num;接着通過兩個while循環來實現計算冰雹數的功能,外while循環通過num與N的大小關係來控制整個循環是否已達到題目對N的要求;內while循環用來計算每個num對應的那個峯值,當fin<1是該循環結束,若fin>max,就更新max的值;在內while循環結束後,num的值加1,準備進入下一個num的遍歷;最後,函數返回最大值max;
(2)接着, 在主函數中,調用該函數即可;
4、注意點
在內while循環中每次開始都要把num的值賦給fin,因爲num的值不能別改變,只能在循環結束後加1,所以要用中間變量fin存放num的值,代替num進行遍歷;
5、C++代碼
#include<iostream>
using namespace std;
int calculate(int N)
{
int max=1,fin,num=2; //定義變量:max存放最大值,fin存放變化過程中的值,num存放小於N的數;
while(num<N){ //當num增加到N是外while循環結束;
fin=num; //每次循環開始的時候把新的num值賦值給fin,使num值不變;
while(fin>1){ //當fin等於1時,內while循環結束。
if(fin%2==0) { fin=fin/2; } //變化規則;
else { fin=fin*3+1; } //變化規則;
if(fin>max) { max=fin; } //每次變換一次,把得到的值與max比較,若大於max就更新max的值;
}
num++; //num加1,準備開始下個數的循環;
}
return max; //當外while循環結束時,返回一個最大值max;
}
int main()
{
int N;
cin>>N;
cout<<calculate(N);
return 0;
}
6、運行截圖
(1)N=10
(2)N=100
(3)N=1000000
N=1000000是題目所給的N的邊界值。
總結:以上就是我對冰雹數這個問題的看法,解法。可能存在着更好,更簡潔的解法代碼,希望大家提出來,我們一起討論,一起學習。這是我第一次寫csdn,若有不足的地方請大家指出,謝謝大家。( O ^ ~ ^ O )