蓝桥杯:冰雹数问题(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 )

发布了12 篇原创文章 · 获赞 3 · 访问量 394

猜你喜欢

转载自blog.csdn.net/weixin_45620022/article/details/104816396