首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言不使用迴圈求整數位數:`log10` 數學法完整實作

     編輯:程式設計綜合問答

數學原理

十進位正整數 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)
查表最快、無分支預測失誤程式碼較長、需維護閾值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved