輸入一個正整數 (≤ 10 位,無前導零),從高位到低位逐位輸出,數字間用空格分隔,最後一個數字無尾隨空格。
利用 % 10 取低位、/ 10 去低位,得到**逆序**數字,存入陣列再反向輸出。
#includeint main() { int num; if (scanf("%d", &num) != 1) return 0; int digits[10]; int len = 0; // 分解: 低位在前 while (num > 0) { digits[len++] = num % 10; num /= 10; } // 輸出: 高位在前 (逆向遍歷) for (int i = len - 1; i >= 0; i--) { printf("%d", digits[i]); if (i > 0) putchar(' '); } putchar('\n'); return 0; }
void print_digits(int n) {
if (n == 0) return; // 基底: 遞迴結束
print_digits(n / 10); // 先處理高位
// 回溯時輸出低位
static int first = 1;
if (!first) putchar(' ');
first = 0;
printf("%d", n % 10);
}
// 注意: 遞迴深度 ≤ 10 (10位數) 完全安全
// 需處理 n=0 特例 (題目說正整數,無前導零,故 n≥1)
#include#include int main() { char s[12]; if (scanf("%11s", s) != 1) return 0; // 直接讀字串 for (int i = 0; s[i]; i++) { putchar(s[i]); if (s[i+1]) putchar(' '); // 非最後一字元加空格 } putchar('\n'); return 0; }
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 陣列逆序 | 純整數運算、教學經典、無庫依賴 | 需額外陣列、兩遍遍歷 | 教學、嵌入式無 stdio |
| 遞迴 | 程式碼極簡、利用呼叫堆疊反轉 | 隱式堆疊、靜態變數處理首尾空格較繁 | 資料量極小、函數式風格 |
| 字串讀取 | 最簡潔、直接對應輸出格式、無數學運算 | 依賴字串輸入格式、非「數學分解」 | 實務開發、OJ 允許字串讀取 |
| 輸入 | 輸出 |
|---|---|
| 654321 | 6 5 4 3 2 1 |
| 1 | 1 |
| 1000000000 | 1 0 0 0 0 0 0 0 0 0 |
| 9876543210 | 9 8 7 6 5 4 3 2 1 0 |
for(...) printf("%d ", d) → 最後多一空格。**必須條件判斷**。num=0:題目說正整數,但若輸入 0,while(num>0) 不進入,無輸出。可加特判。int digits[10] 或 [11]。scanf("%d") 讀取超大數字溢位:題目限 ≤ 10 位,int (32 位) 最大 2147483647 (10 位),邊界剛好。更保險用 long long 或字串讀取。整數逐位分割 = 取模/除法分解 → 逆序存儲 → 正序輸出。三種方案各有千秋:**字串法最工程化、陣列法最教學化、遞迴法最算法化**。面試常考「不使用陣列/字串/遞迴如何做?」→ 答案:先算位數 pow10,再從高位依次 / pow10 % 10 輸出。