輸入一個五位整數(10000~99999),判斷是否為回文數。回文數定義:萬位=個位,千位=十位。例如 12321、45554 均為回文數。
利用整除與取模運算提取各位數字:
num / 10000num / 1000 % 10num % 100 / 10num % 10判斷條件:(萬位 == 個位) && (千位 == 十位)
#include <stdio.h>
int main() {
int num = 0;
printf("please input a int num: ");
// 輸入驗證迴圈:確保輸入為五位數
do {
if (num != 0) {
if (num < 10000)
printf("so, input a bigger one: ");
else
printf("so, input a smaller one: ");
}
scanf("%d", &num);
} while (num > 99999 || num < 10000);
// 回文判斷
if ((num / 10000 == num % 10) && (num / 1000 % 10 == num % 100 / 10))
printf("Yes, it is!\n");
else
printf("No, it isn't!\n");
return 0;
}
do-while 模式至少執行一次 scanf,並在輸入不合法時給出具體提示(過大/過小),用戶體驗優於單純的 while。
對比字符串反轉法(sprintf + strcmp),純整數運算:
• 無內存分配
• 無庫函數調用開銷
• 適合嵌入式/高性能場景
| 輸入 | 結果 | 說明 |
|---|---|---|
| 12321 | Yes | 標準回文 |
| 10001 | Yes | 含零回文 |
| 99999 | Yes | 最大五位回文 |
| 12345 | No | 非回文 |
| 9999 | 重新輸入 | 四位數被攔截 |
| 100000 | 重新輸入 | 六位數被攔截 |
bool is_palindrome(int num) {
if (num < 0) return false;
int original = num, reversed = 0;
while (num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return original == reversed;
}
此法通用於任意位數,但會改變原數值(需備份),且存在整數溢出風險(輸入接近 INT_MAX 時)。五位數專用的數學分解法更安全高效。