最近接触到一个程序设计能力考试网站:PTA。考试什么的不提,但里面提供了几个级别的程序设计题库确实很赞。我试水了一下乙级题目,确实不错,很考验程序员的程序设计能力。

本来是想着用 PHP 做题的,但里面设计到控制台输入输出内容,我在第一题尝试 PHP 做题未果后,果断切换成 C 实现了。这也让我重新学习了一下 C 语言相关的基础知识。

1001 害死人不偿命的(3n+1)猜想

我写的 PHP 版本(未通过):

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/4/15
 * Time: 11:07
 */

function calculate_times($num) {

    $times = 0;

    if ($num > 1000 || $num < 1) {
        return $times;
    }

    if (floor($num) != $num) {
        return $times;
    }

    while ($num != 1) {
        if ($times > 10000) {
            break;
        }

        if ($num % 2 == 1) {
            $num = (3 * $num + 1) / 2;
        } else {
            $num = $num / 2;
        }

        $times += 1;
    }

    return $times;
}

$num = (int)fgets(STDIN);

$res = calculate_times($num);

fwrite(STDOUT, $res);

不清楚到底是那边不符合要求,我本地控制台(命令行)执行在我看来符合标准的,有知道原因的朋友欢迎留言指点。

C 语言版本(已通过):

#include <stdio.h>

int main() {
    int n,step=0,is_odd;
    scanf("%d", &n);
    while (n != 1) {
        is_odd = n % 2;
        if (is_odd == 1) {
            n = (3 * n + 1) / 2;
        } else {
            n = n / 2;
        }
        step += 1;
    }
    printf("%d", step);
    return 0;
}

C 语言属于强类型语言,定义变量、函数都需要声明类型。scanf 在网站上编译执行报了一个 warning,说是没有获取 scanf 的返回值,这个不重要,可以忽略。