1 条题解

  • 0
    @ 2026-8-18 12:12:46

    思路

    把一个数"从低位到高位"拆开,靠的是两个基本运算:

    • n % 10:取出最后一位(个位);
    • n / 10:去掉最后一位。

    比如 n = 12345:

    步骤 n % 10(取出) n / 10(剩余)
    1 5 1234
    2 4 123
    3 12
    4 2 1
    5 1 0

    取出的顺序正好是 5 4 3 2 1,从低到高,符合要求。循环条件就是 n > 0,n 变成 0 时所有数位都取完了。

    输出空格的技巧:要求两个数之间有空格、行尾没有多余空格。最简单的办法是"每个数前面输出空格,但第一个数除外":

    if (first) first = 0;
    else printf(" ");
    printf("%d", d);
    

    代码

    #include <stdio.h>
    
    int main() {
        int n;
        scanf("%d", &n);
    
        if (n == 0) {           // 特判:0 要输出一个 0
            printf("0\n");
            return 0;
        }
    
        int first = 1;          // 是否是第一个输出的数字
        while (n > 0) {
            int d = n % 10;     // 取出最低位
            if (first) first = 0;
            else printf(" ");   // 非第一个数,前面补空格
            printf("%d", d);
            n /= 10;            // 去掉最低位
        }
        printf("\n");
        return 0;
    }
    

    为什么必须特判 n = 0:循环条件是 n > 0,如果 n 本身就是 0,循环一次都不执行,程序会输出一个空行,这是错误答案。测试数据里专门包含了 n = 0 的用例,所以第一版代码就必须写上这个特判(已包含在上面的完整代码里)。

    另一种思路:递归(进阶)

    #include <stdio.h>
    
    void printDigits(int n) {
        if (n < 10) {           // 只剩一位,直接输出
            printf("%d", n);
            return;
        }
        printf("%d ", n % 10);  // 先输出最低位
        printDigits(n / 10);    // 剩下的交给递归
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        printDigits(n);
        printf("\n");
        return 0;
    }
    

    递归版天然满足"最低位最先输出、行尾无空格",而且 n = 0 也能正确输出 0。

    易错点

    • 行尾不能有多余空格:不要每个数字后面都跟一个空格,用"前面补空格"或递归的方式控制。
    • n < 10⁹ 在 int 范围内(约 21 亿上限),用 int 即可;若想保险可换 long long。
    • n = 0 是边界:循环版必须特判(已写入主代码),否则输出空行、直接判错。
    • 顺序别搞反:本题是从低位到高位(样例 12345 输出 5 4 3 2 1),不是通常的从高位到低位。

    信息

    ID
    10
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者