角谷猜想

· · 个人记录

角谷猜想

题目描述

所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘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!