藍橋杯:冰雹數問題(C++)

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的邊界值。
N=1000000是題目所給的N的邊界值。

總結:以上就是我對冰雹數這個問題的看法,解法。可能存在着更好,更簡潔的解法代碼,希望大家提出來,我們一起討論,一起學習。這是我第一次寫csdn,若有不足的地方請大家指出,謝謝大家。( O ^ ~ ^ O )

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