蓝桥杯-3n+1问题(例题)

“3n+1”问题:

       对于任意大于1的自然数n,若该数为偶数则将其变为原来的一半,若为奇数则将其变为3n+1。反复进行上述过程,直到结果为1时停止。这就是著名的“3n+1”问题。要求输入n,输出按“3n+1”规则变换到1所需要的数字变换次数。(n<=10^9)

分析:

        因循环次数不确定,而且n也不是“递增”式的循环,因此可用while循环实现计算过程,用一个计数变量统计数字变换次数。不过需要特别注意的是,若n是无限接近10^9的奇数,如果声明为int型,在乘以3的过程中会出现溢出,因此输入的数在运算过程中应声明为长整型,并避免直接输入输出(不同编译器输入输出格式有区别);或者使用C++输入输出流等方法。

源代码:

#include 
int main()
{
	int num,count;                             //count:“计数器”,统计变换次数
	long long n;                               //长整型参与运算,避免乘法溢出问题
	while(scanf("%d",&num)!=EOF)
	{
		count=0;
		n=num;
		while(n>1)                         //奇偶分类讨论
		{
			if(n%2==1)
				n=3*n+1;
			else
				n/=2;
			count++;
		}
		printf("%d\n",count);
	}
	return 0;
}

程序截图:

蓝桥杯-3n+1问题(例题)_第1张图片

你可能感兴趣的:(蓝桥杯基础专题)