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

演算法題解:反轉整數 — 處理正負號與尾隨零的完整 C 語言實作

     編輯:關於C

題目描述

給定一個 32 位元有號整數,輸出其反轉後的數值。規則如下:

  1. 正整數且不以 0 結尾:一般反轉,如 12 → 21。
  2. 負整數:保留負號反轉,如 -12 → -21。
  3. 以 0 結尾:尾隨零保留在反轉結果末尾,如 1200 → 2100 (而非 21)。

輸入測資筆數 n (n < 100),每行一個整數。

演算法邏輯

  1. 判斷正負號,記錄 flag,負數轉正處理。
  2. 從個位數開始拆解數字 (num % 10)。
  3. 使用 tab 標記是否仍在處理「尾隨零」區段。
  4. 非零數字存入陣列 array,零則累計 count。
  5. 輸出時:先印負號(如有) → 印陣列非零數字 → 印尾隨零。

完整 C 語言程式碼


#include <stdio.h>

int main() {
    int n, num, i, j, count, flag, tab;
    int array[20];  // 足夠存放 32 位整數各位 (最多 10 位)
    
    scanf("%d", &n);
    while (n--) {
        scanf("%d", &num);
        
        j = 0;
        count = 0;
        tab = 1;       // 1 表示尚在尾隨零區段
        flag = 1;      // 1 正數, 0 負數
        
        if (num < 0) {
            flag = 0;
            num = -num;  // 轉為正數處理,注意 INT_MIN 會溢位,題目範圍內安全
        }
        
        // 拆解各位數字
        while (num > 0) {
            int digit = num % 10;
            if (digit == 0 && tab) {
                count++;        // 記錄尾隨零個數
            } else {
                array[j++] = digit; // 存入非零或零(已離開尾隨區段)
                tab = 0;            // 結束尾隨零區段
            }
            num /= 10;
        }
        
        // 輸出
        if (!flag) printf("-");
        for (i = 0; i < j; i++) printf("%d", array[i]);
        for (i = 0; i < count; i++) printf("0");
        if (n > 0) printf("\n");
    }
    return 0;
}

關鍵細節解析

變數用途
tab狀態旗標:1=正在掃描尾隨零,0=已遇到非零數字
count尾隨零計數器
array儲存非尾隨零部分的數字 (逆序)
flag正負號標記

測試案例驗證


輸入:
3
12
-12
1200

輸出:
21
-21
2100

邊界條件與改進方向

  • 輸入為 0:原碼 while(num) 會直接跳過,輸出空行。需特判 if (num == 0) { printf("0"); continue; }。
  • INT_MIN (-2147483648):取負會溢位。建議用 long long 處理或特判。
  • 輸出緩衝:大量測資建議用 putchar 或累積字串一次 printf。

複雜度分析

  • 時間複雜度:O(log₁₀|n|) 每個測資,即數字位數。
  • 空間複雜度:O(log₁₀|n|) 陣列儲存。

核心技巧:tab 旗標優雅地區隔「尾隨零」與「中間零」,避免複雜的字串操作,純整數運算高效解決問題。

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