經典 C 語言練習:輸入一個整數,計算其十進制位數。代碼核心邏輯:
int x, n = 0;
scanf("%d", &x);
n = n + 1; // 步驟 3
x /= 10; // 步驟 4
while (x > 0) {
n++;
x /= 10;
}
printf("%d\n", n);
n = n + 1 (或直接 n = 1)int n = 1;,更簡潔x /= 10 (即 x = x / 10)while (x > 0)n=1,x=0,循環不進入,輸出 1(正確)x > 0 為假,直接輸出 1(錯誤,應為 3 位)#include
#include
int countDigits(int x) {
if (x == 0) return 1; // 特殊情況:0 是 1 位
if (x == INT_MIN) return 10; // -2147483648 絕對值溢出,直接返回 10
if (x < 0) x = -x; // 負數取絕對值
int n = 0;
while (x > 0) {
n++;
x /= 10;
}
return n;
}
int main() {
int x;
printf("輸入整數: ");
scanf("%d", &x);
printf("位數: %d\n", countDigits(x));
return 0;
}
| 方法 | 代碼 | 優點 | 缺點 |
|---|---|---|---|
| 循環除 10 | while(x){n++;x/=10;} | 無庫依賴、教學經典 | 需處理負數、0、INT_MIN |
| 對數函數 | n = (int)log10(abs(x)) + 1 | O(1) 常數時間 | 浮點精度問題、需 math.h、處理 0 |
| 轉字串 | sprintf(buf, "%d", x); n = strlen(buf); | 直觀、自動處理負號 | 較慢、佔用棧內存 |
| 查表法 | 預計算閾值數組二分查找 | 極快、無除法 | 代碼較長 |
123/10=12、1/10=0n 等於已處理的位數,x 為剩餘未處理的高位部分INT_MIN 是考試/面試常考陷阱n = n + 1; x /= 10; 可合併為初始化 n=1 後直接循環總結:理解「除以 10 切掉個位」的直觀邏輯,並養成處理邊界條件的習慣,是掌握此類位運算/數值處理算法的關鍵。