統計 1 到 100 之間所有整數中,數字 9 總共出現幾次?這是位數分離與計數器的基礎練習。
#include <stdio.h>
int main() {
int count = 0;
for (int num = 1; num <= 100; num++) {
int hundreds = num / 100;
int tens = (num % 100) / 10;
int units = num % 10;
if (hundreds == 9) count++;
if (tens == 9) count++;
if (units == 9) count++;
}
printf("數字 9 出現次數:%d\n", count);
return 0;
}
手動驗證:
#include <stdio.h>
#include <string.h>
int countDigitInRange(int start, int end, char target) {
int count = 0;
char buffer[12];
for (int i = start; i <= end; i++) {
sprintf(buffer, "%d", i);
for (char *p = buffer; *p; p++) {
if (*p == target) count++;
}
}
return count;
}
int main() {
printf("9 出現次數:%d\n", countDigitInRange(1, 100, '9'));
printf("5 出現次數:%d\n", countDigitInRange(1, 1000, '5'));
return 0;
}
對於大範圍(如 1 到 10^9),逐個檢查太慢。可用數位 DP 或數學公式:
// 計算 1 到 n 中數字 d 出現次數
int countDigit(int n, int d) {
int count = 0;
for (long long factor = 1; factor <= n; factor *= 10) {
int lower = n % factor;
int cur = (n / factor) % 10;
int higher = n / (factor * 10);
if (cur < d) count += higher * factor;
else if (cur == d) count += higher * factor + lower + 1;
else count += (higher + 1) * factor;
// 處理 d=0 的前導零問題
if (d == 0) count -= factor;
}
return count;
}