題目規則
- 正整數且不以0結尾 → 一般反轉 (12 → 21)
- 負整數 → 反轉後保持負號 (-12 → -21)
- 以0結尾 → 尾端零保留在反轉結果末尾 (1200 → 2100)
演算法策略
- 記錄正負號
flag,負數轉正處理
- 逐位取模10分解數字,同時計數尾端零個數
count
- 非零位存入陣列
array,遇到第一個非零位後 tab=0 停止計數尾端零
- 輸出:負號 → 陣列逆序 (實際為正序,因分解是從低位開始) → 補上尾端零
完整原始碼
#include <stdio.h>
int main() {
int n, num, count, flag, tab, j, i;
int array[100];
scanf("%d", &n);
while (n--) {
scanf("%d", &num);
j = 0; tab = 1; flag = 1; count = 0;
if (num < 0) { flag = 0; num = -num; }
while (num) {
if (num % 10 == 0 && tab) count++;
else { array[j++] = num % 10; 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;
}
範例追蹤
輸入: -1200
flag=0, num=1200
分解: 0(count=1) → 0(count=2) → 2(array[0]) → 1(array[1])
輸出: - + 21 + 00 = -2100 ✓
邊界情況
- 輸入 0:題目隱含非零整數,若為0則
while(num)不執行,無輸出
- 32位整數範圍內,反轉後可能溢位,題目不要求處理