1. 程式人生 > 其它 >[AcWing 338] 計數問題

[AcWing 338] 計數問題


不使用 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;
}