最近想学一学C语言,然后找来了PAT里的题目来练一练。
不积跬步,无以至千里,不积小流,无以成江海。
先从乙级开始,一题一题做会了,也就能提升自己实力了。
首先来看一下题目。
一个著名的卡拉兹猜想,对于任意给定的正整数n,如果是偶数,就除以一半,如果是奇数,那么就把这个奇数变成3n+1,然后再除以一半,最后求给定的任意一个不超过1000的正整数n,用C语言来求需要多少步才能得到n=1。
输入的形式:输入正整数n的值,比方说2、3。
输出的形式:就是从n计算到1的步骤。
我一直有这样一个想法,在拿到一道编程题的时候。
最为重要的,就是要理清楚这道编程题的逻辑。
现在,我就来理一理这道题的逻辑,用流程图来理顺编程题的逻辑最好了。
理顺逻辑,流程图是极好的办法
1、我们要求最后得到的结果是n=1,那么只要当n!=1的时候,那就应该一直在除以2,而当n==1的时候,那就应该把总的计数给输出出来。
2、之后,我们要输入的正整数n不超过1000,所以说,这里也要做个判断,也就是n<1000的话,就进行下一步,而如果n>1000的话,那就再重新进行输入。
3、之后就要进行奇偶数判断。
4、如果是奇数的话,也就是余数为1,那就要在3n+1的基础来除以2。
如果是偶数的话,也就是余数为0,那就直接在n的基础上除以2。
5、然后进行计数,每进行一次这样的步骤就多计数1次。
6、进行总计数。
如下图所示,这就是一张流程图,看起来就更顺了。
代码的实现
如果要实现功能的话,正如这张流程图所示。
首先要定义一个n,这个n就是我们要输入的值来进行一定的判断,直到最后n的值为1的时候,那就输出最终的结果,也就是得到最终计数的值。
那么,这里就可以写一个while循环语句,判断条件就是n!=1的时候,就一直在这个循环内。
之后,是不是还要再进行一个判断,如果n>1000的话,那就要重新输入,那这里就可以写一个if条件语句。
如果n<1000,就继续下一步,同时,这里也要写一个if条件语句,进行判断,我们这里用到的是除以2,然后判断余数是0还是1,若是0,则为偶数,若是1,则为奇数,之后3n+1再进行下一步。
很明显,写到这里应该这个代码逻辑就理顺了,也就变得很简单了。
不需要多讲,直接放出代码即可。
#include <stdio.h>
int main() {
int n;
int count = 0;
scanf("%d",&n);
while(n!=1){
if(n>1000){
scanf("%d",&n);
}
if(n%2==0){
n = n/2;
count = count + 1;
}
else if(n%2==1){
n = (3*n + 1)/2;
count = count + 1;
}
}
printf("%d\n",count);
}
在写完之后,再放到PAT练习网站上测一测,看一看最终效果。
总的来说,难度不大,只是要理清逻辑,一步步理顺即可,就能做出这道题。