給定一個 32 位元有號整數,輸出其反轉後的數值。規則如下:
12 → 21。-12 → -21。1200 → 2100 (而非 21)。輸入測資筆數 n (n < 100),每行一個整數。
flag,負數轉正處理。num % 10)。tab 標記是否仍在處理「尾隨零」區段。array,零則累計 count。
#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
while(num) 會直接跳過,輸出空行。需特判 if (num == 0) { printf("0"); continue; }。long long 處理或特判。putchar 或累積字串一次 printf。核心技巧:
tab旗標優雅地區隔「尾隨零」與「中間零」,避免複雜的字串操作,純整數運算高效解決問題。