1. 程式人生 > >Uva1640(統計數字出現的次數)

Uva1640(統計數字出現的次數)

還要 eof ring size set include algorithm swa ios

題意:

統計兩個整數a,b之間各個數字(0~9)出現的次數,如1024和1032,他們之間的數字有1024 1025 1026 1027 1028 1029 1030 1031 1032 總共有10個0,10個1,3個3等等。

解法:

這類問題的一般步驟都是先用f(n,d)計算出0~n中d數字出現的次數,那麽答案就是f(b,d)-f(a-1,d)

下面程序中的註釋為(1,2974)的第一層(未遞歸)解釋,遞歸後同理

1-2974 拆分為1-2970 和 2971-2974

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4
using namespace std; 5 int l, r; 6 int a[11], b[11]; 7 8 void solve(int n, int m) { 9 int x = n / 10;//除了末位以外的 x=297 10 int y = n % 10;//最後一位的數字範圍 y=4 11 int tmp = x; 12 //計算小於10*x+1到10*x+y中個位數的個數,b[1-y]也就是(2971-2974)個位數 13 for (int i = 1; i <= y; i++)b[i] += m;
14 //計算10*x-10到10*x-1中個位數的總個數,296 0-296 9 個位數個數每個都是296個 15 for (int i = 0; i <= 9; i++)b[i] += m*x; 16 while (tmp) { 17 //10*x 到10*x+y非個位的個數,因為從0開始,所以*(y+1)就是非個位位數,當然還要乘m 18 b[tmp % 10] += m*(y + 1); 19 tmp /= 10; 20 } 21 if (x) solve(x - 1, m * 10); 22 } 23 24 int main() {
25 while (cin >> l >> r && (l || r)) { 26 memset(b, 0, sizeof(b)); 27 if (l > r)swap(l, r); 28 solve(l - 1, 1); 29 for (int i = 0; i <= 9; i++)a[i] = b[i], b[i] = 0; 30 solve(r, 1); 31 cout << b[0] - a[0]; 32 for (int i = 1; i <= 9; i++)cout << " " << b[i] - a[i]; 33 cout << endl; 34 } 35 return 0; 36 }

Uva1640(統計數字出現的次數)