十進位正整數 n 的位數 d = floor(log10(n)) + 1。
等價於 (int)log10(n * 10)(避免 n=1 時 log10(1)=0 需額外 +1)。
#include
#include
int digit_count(int n) {
if (n == 0) return 1; // 特殊情況
if (n < 0) n = -n; // 處理負數
return (int)log10(n * 10.0); // n*10 保證 log10 >= 1
}
int main() {
int test[] = {0, 1, 9, 10, 11, 99, 123, 888, 10001, -42};
for (int i = 0; i < 10; i++) {
printf("%6d -> %d 位\n", test[i], digit_count(test[i]));
}
return 0;
}
0 -> 1 位
1 -> 1 位
9 -> 1 位
10 -> 2 位
11 -> 2 位
99 -> 2 位
123 -> 3 位
888 -> 3 位
10001 -> 5 位
-42 -> 2 位
// 遞迴
int digits_rec(int n) {
if (n < 0) n = -n;
return n < 10 ? 1 : 1 + digits_rec(n / 10);
}
// 查表(32 位整數最大 10 位)
int digits_lut(int n) {
if (n < 0) n = -n;
if (n >= 1000000000) return 10;
if (n >= 100000000) return 9;
if (n >= 10000000) return 8;
if (n >= 1000000) return 7;
if (n >= 100000) return 6;
if (n >= 10000) return 5;
if (n >= 1000) return 4;
if (n >= 100) return 3;
if (n >= 10) return 2;
return 1;
}
| 方法 | 優點 | 缺點 |
|---|---|---|
| log10 | 程式碼簡潔、O(1) | 需連結 math 库、浮點誤差極大數需測試 |
| 遞迴 | 無依賴、易理解 | 函數呼叫開銷、棧深度 log10(n) |
| 查表 | 最快、無分支預測失誤 | 程式碼較長、需維護閾值 |