1 条题解
-
0
思路
把一个数"从低位到高位"拆开,靠的是两个基本运算:
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
- 上传者
吉公网安备22010402001496号