首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言經典題解:整數逐位分割輸出 (高位到低位)

     編輯:關於C

題目:分割整數

輸入一個正整數 (≤ 10 位,無前導零),從高位到低位逐位輸出,數字間用空格分隔,最後一個數字無尾隨空格。

解法一:陣列暫存逆序 → 正序輸出

利用 % 10 取低位、/ 10 去低位,得到**逆序**數字,存入陣列再反向輸出。

#include 

int 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 允許字串讀取

測試案例

輸入輸出
6543216 5 4 3 2 1
11
10000000001 0 0 0 0 0 0 0 0 0
98765432109 8 7 6 5 4 3 2 1 0

常見錯誤

  • 輸出尾隨空格:for(...) printf("%d ", d) → 最後多一空格。**必須條件判斷**。
  • 未處理 num=0:題目說正整數,但若輸入 0,while(num>0) 不進入,無輸出。可加特判。
  • 陣列大小不足:10 位數需 int digits[10] 或 [11]。
  • scanf("%d") 讀取超大數字溢位:題目限 ≤ 10 位,int (32 位) 最大 2147483647 (10 位),邊界剛好。更保險用 long long 或字串讀取。

總結

整數逐位分割 = 取模/除法分解 → 逆序存儲 → 正序輸出。三種方案各有千秋:**字串法最工程化、陣列法最教學化、遞迴法最算法化**。面試常考「不使用陣列/字串/遞迴如何做?」→ 答案:先算位數 pow10,再從高位依次 / pow10 % 10 輸出。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved