今天的这道题目着实把我难住了好久,不愧是PAT乙级中值25分的一道题。
这道题呢,是在PAT乙级1001的基础上来增加了一些难度,但是呢,还没有涉及到数据结构,可以说只需要盘清楚逻辑,就可以做这道题了。
我们先来看一看这道题描述了什么:
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推到的每一个数。
例如对n=3验证的时候,我们需要计算3、5、8、4、2、1,当我们对n=5、8、4、2进行验证的时候,由于我们之前在验证3的时候已经递推过了,所以就不需要验证这些数字。
看到这句话的时候,我还有些不解,但其实很好理解。
我来稍微理一理逻辑:
当n=3的时候,n=3是奇数,根据卡拉兹猜想,奇数要3n+1,然后除以2,很显然可以得到5;
继续往下推,n=5是奇数,(3n+1)/2=8;
偶数是直接除以2,所以8/2=4,4/2=2,2/2=1。
很显然,后面的这些数字5、8、4、2,在我们用卡拉兹猜想验证n=3的时候已经都用到过了,自然而然地也不需要再进行验证了。
审题分析,理清逻辑,流程图
我在每次做这些题目的时候,都会先理逻辑,然后画一个流程图,主要目的呢就是为了帮助我之后如果想来复盘题目的话,能够快速地知道自己哪里出现了问题,并且会较为详细地记录自己的做题过程。
1、第一行给出一个正整数K。
2、第二行给出K个互不相同的待验证的正整数n(1<n<=100)的值,由于要对这些给出的正整数进行数值上的判断,所以最好用数组来进行存储,主要是用来存储一系列相同类型的变量,然后再对数组中的数据来进行处理,需要在for循环中。
3、接下来就是要进行卡拉兹猜想验证,与之前状态相同,就是遍历整个数组,然后从第一个数字开始验证,所以我们要用一个for循环来遍历整个数组。
4、然后,很多数字会在进行卡拉兹猜想验证的时候出现,只要把这些出现的数字与原本数组中的数字进行比较,亦或者直接把原本数组中的这些数字给删除/给这些出现过的数字