角谷猜想
角谷猜想
题目描述
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。
程序要求输入一个整数,将经过处理得到1的过程输出来。
输入
一个正整数N(N <= 2,000,000)
输出
从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。
样例输入
5
样例输出
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
End
这道题目是一道经典的数学猜想题,如果把它转换成编程语言,该怎么来写呢?其实也很简单。
首先,我们先不要想着这是一道编程题目,我们只是单纯的把它当成一道数学题目,如果只把它看成数学题,那么相信只要给大家一台能够支持计算量极大的计算机,每个人都能够算出最终的结果,那么转换成计算机语言其实也很简单:
在这里,我们提一个概念:人脑和电脑,电脑是用来干什么的?就是为了便利人们的,一般的简单运算人们都能够通过大脑快速的计算出来。但是当涉及到的数据量十分多而且计算量十分大的时候,我们就需要用到电脑来帮助我们,可以说,电脑只是模拟人脑推演某个计算过程的工具,所以,我们在写一道题目之前,先尝试着用你的大脑去把它的结果得出来,再理清思路,将你思考的过程记录下来,也就是记录:在你得出结果的过程中,你的大脑都干了些什么?进行了什么运算?然后,再把这些步骤转化为计算机语言。
那我们接下来看到题目,题目要求为:奇数×3+1,偶数÷2,那么根据给出的例子,我们可以现在大脑中进行一个简单的计算:
5,奇数,执行语句后变为16;
16,偶数,执行语句后变为8;
8,偶数,执行语句后变为4;
4,偶数,执行语句后变为2;
2,偶数,执行语句后变为1;
看,结果是不是很容易就出来了? 那么接下来我们把我们的思考过程,转化成计算机语言; 首先,我们做一个简单的判断(设该输入数为N):
if(N%2==0)
这个判断是:对2求余是否为0,如果是0,说明N是偶数,如果不是,说明N是奇数;那么,我们根据题目要求,进行下一步操作:
if(N%2==0){
cout<<N<<"/2="<<N/2<<endl;
N/=2;
} else {
cout<<N<<"*3+1="<<N*3+1<<endl;
N=N*3+1;
}
这就是我们的整道题目最核心的判断和执行语句部分了,题目讲到这儿相信大家都能理解了,其余的基础代码我就不写了,祝大家大吉大利,题目AC!