[AcWing 338] 計數問題
阿新 • • 發佈:2022-05-25
不使用 vector 的寫法
點選檢視程式碼
#include<iostream> #include<cmath> using namespace std; // 計算 n 有多少位 int dgt(int n) { int res = 0; while (n) { res ++; n /= 10; } return res; } // 計算從 1 到 n 的整數中數字 i 出現的次數 int count(int n, int i) { int res = 0, d = dgt(n); // 從右到左第 j 位上數字出現的次數 for (int j = 1; j <= d; j ++) { // l 和 r 是第 j 位左邊和右邊的整數,dj 是第 j 位數字 int p = pow(10, j - 1), l = n / p / 10, r = n % p, dj = n / p % 10; // 第 j 位左邊的整數小於 l 的情況 (第 j 位不為 0) if (i) res += l * p; // 如果 i = 0,左邊高位不能全為 0 if (!i && l) res += (l - 1) * p; // 第 j 位左邊的整數等於 l 的情況 // i || l 表示左高位不全為 0 // dj 右邊的取值 0 ~ p - 1 if ((dj > i) && (i || l)) res += p; // dj 及其左邊的都已經到最大,右邊的取值 0 ~ r if ((dj == i) && (i || l)) res += r + 1; } return res; } int main() { int a, b; while (cin >> a >> b , a) { if (a > b) swap(a, b); for (int i = 0; i <= 9; i ++) cout << count(b, i) - count(a - 1, i) << ' '; cout << endl; } return 0; }