將一個三位自然數拆解為百位、十位、個位數字,是掌握整數除法(/)與取模運算(%)的經典入門題。本文從核心邏輯、代碼實現、邊界情況到擴展思維,層層遞進講解這一基礎算法。
設三位數為 n(100 ≤ n ≤ 999):
n / 100(整數除法自動截斷小數部分)(n / 10) % 10 或 n % 100 / 10n % 10關鍵洞察: / 向右移動數位,% 保留低位數字。組合使用即可精準提取任意位。
#include <stdio.h>
int main() {
int num;
scanf("%d", &num);
int hundred = num / 100;
int ten = (num / 10) % 10; // 等價於 num % 100 / 10
int unit = num % 10;
printf("%d %d %d\n", hundred, ten, unit);
return 0;
}
| 輸入 | 百位 | 十位 | 個位 | 輸出 |
|---|---|---|---|---|
| 256 | 2 | 5 | 6 | 2 5 6 |
| 100 | 1 | 0 | 0 | 1 0 0 |
| 999 | 9 | 9 | 9 | 9 9 9 |
if (num < 100 || num > 999)-123 % 10 == -3,若需支持負數需取絕對值scanf("%d", num) 缺少 & 導致崩潰%d%d%d 或多餘換行利用數組或遞歸實現通用位數提取(由低位到高位):
#include <stdio.h>
void printDigits(int n) {
if (n == 0) return;
printDigits(n / 10); // 遞歸處理高位
printf("%d ", n % 10); // 輸出當前低位
}
int main() {
int num;
scanf("%d", &num);
if (num == 0) printf("0");
else printDigits(num);
printf("\n");
return 0;
}
遞歸優勢: 自動處理最高位前導零問題,邏輯清晰符合數學直覺。
/ 與 % 實現十進制轉二進制/八進制/十六進制在實際項目中,建議封裝為通用工具函數:
// 返回數字各位組成的數組(低位在前),同時返回位數
int extractDigits(int n, int digits[], int maxSize) {
int count = 0;
if (n == 0) {
if (maxSize > 0) digits[count++] = 0;
return count;
}
while (n != 0 && count < maxSize) {
digits[count++] = n % 10;
n /= 10;
}
return count;
}
掌握位數拆解不僅是通過 OJ 題目,更是建立「位運算思維」的基石。從此題出發,可延伸至位掩碼、哈希算法、加密解密等計算機科學核心領域。建議動手實現遞歸與迭代兩版本,體會時空複雜度的權衡之道。