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

C 語言計算整數位數:while 循環除以 10 算法完整解析

     編輯:程式設計綜合問答

經典 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);

逐行邏輯詳細解析

步驟 3:n = n + 1 (或直接 n = 1)

  • 意圖:任何非零整數至少有 1 位
  • 邏輯:輸入 5 → 1 位;輸入 123 → 先計為 1 位,循環再累加剩餘位
  • 優化:可直接初始化 int n = 1;,更簡潔

步驟 4:x /= 10 (即 x = x / 10)

  • 整數除法特性:C 語言整數相除**捨去小數部分** (向零截斷)
  • 效果:將個位數字「切掉」
    123 / 10 = 12
    12 / 10 = 1
    1 / 10 = 0 (循環結束)
  • 計數邏輯:每除一次 10,位數 +1,直到商為 0

循環條件:while (x > 0)

  • 正數情況完美適用
  • 缺陷:輸入 0 時,初始 n=1,x=0,循環不進入,輸出 1(正確)
    輸入負數 -123 時,x > 0 為假,直接輸出 1(錯誤,應為 3 位)

完善版代碼(處理 0、負數、邊界)

#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;
}

替代算法對比

方法代碼優點缺點
循環除 10while(x){n++;x/=10;}無庫依賴、教學經典需處理負數、0、INT_MIN
對數函數n = (int)log10(abs(x)) + 1O(1) 常數時間浮點精度問題、需 math.h、處理 0
轉字串sprintf(buf, "%d", x); n = strlen(buf);直觀、自動處理負號較慢、佔用棧內存
查表法預計算閾值數組二分查找極快、無除法代碼較長

教學重點總結

  1. 整數除法截斷特性是核心知識點:123/10=12、1/10=0
  2. 循環不變量:每次循環開始前,n 等於已處理的位數,x 為剩餘未處理的高位部分
  3. 邊界條件處理:0、負數、INT_MIN 是考試/面試常考陷阱
  4. 代碼簡化:n = n + 1; x /= 10; 可合併為初始化 n=1 後直接循環

總結:理解「除以 10 切掉個位」的直觀邏輯,並養成處理邊界條件的習慣,是掌握此類位運算/數值處理算法的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved