top1编程
← 返回题目
题解

3的倍数

1 条题解

  • 0
    @ 2026-8-6 2:18:11

    P4856 3的倍数(入门)

    解题思路

    第一步,理解题意。 小童输入一串整数,最后一个数字是 -1,表示输入结束。我们要从这串数字里找出所有能被 3 整除的数,按输入的顺序输出,用空格分隔。-1 是停止信号,不算数字。

    第二步,判断倍数的方法。 判断一个数 x 能不能被 3 整除,最简单的办法是看余数:x % 3 如果等于 0,说明能整除,x 就是 3 的倍数。取余运算 % 是判断倍数的万能钥匙。

    第三步,边读边判断。 这道题不需要先存起来再处理,因为读到什么就可以直接判断什么,整个过程只读一遍就完成了,非常高效。用一个死循环读 x:如果 x 等于 -1 就 break 停止;否则判断 x % 3 == 0,成立就输出 x。

    第四步,控制空格。 输出多个数字时,数字之间要用空格隔开,但最后一个数字后面不能有多余空格。用一个变量 first 表示"是不是第一次输出":第一次输出时前面不加空格,之后每次输出前先加一个空格,这样输出的格式就是整齐的"数字 数字 数字"。

    第五步,边界情况。 负数也可能是 3 的倍数,比如 -3、-6,它们除以 3 的余数也是 0,照常输出;如果整串数字里一个 3 的倍数都没有,就只输出一个换行符。举个例子:输入 1 2 3 4 5 6 7 8 9 -1,能被 3 整除的是 3、6、9,输出"3 6 9",和样例一致。再比如输入 6 3 8 9 -1,能被 3 整除的是 6、3、9,输出"6 3 9"。

    参考代码

    // 3的倍数:输入数字直到-1,输出能整除3的数字
    #include <iostream>
    using namespace std;
    int main() {
        int x;
        int first = 1;   // 控制空格
        while (true) {
            cin >> x;
            if (x == -1) break;   // 遇到-1停止输入
            if (x % 3 == 0) {     // 是3的倍数就输出
                if (!first) cout << ' ';
                cout << x;
                first = 0;
            }
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    时间复杂度:每个数字读入后只判断一次,所以是 O(cnt),其中 cnt 是输入数字的个数。

    空间复杂度:只需要几个变量(x 和 first),不随数字个数增加,是 O(1)。

    • 1