PAT乙级1001 用C语言进行编程

最近想学一学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、进行总计数。

如下图所示,这就是一张流程图,看起来就更顺了。

PAT乙级1001 用C语言进行编程

代码的实现

如果要实现功能的话,正如这张流程图所示。

首先要定义一个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练习网站上测一测,看一看最终效果。

PAT乙级1001 用C语言进行编程

总的来说,难度不大,只是要理清逻辑,一步步理顺即可,就能做出这道题。

上一篇:CF1060H Sophisticated Device【构造】


下一篇:基于MeanShift的目标跟踪算法及实现