给出一段区间a-b,统计这个区间内0-9出现的次数。
比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次。
Input
两个数a,b(1 <= a <= b <= 10^18)
Output
输出共10行,分别是0-9出现的次数
//给定一个数 求他百位上面出现k的次数 自行枚举找规律 //比如求0的次数 //那么分为 =0 和 > 0的情况 //=0 比如 1029 百位 出现0的有 1000-1029 30个 (before-1)*100 + after+1 //>0 比如 1129 百位 出现0的有 1000-1099 100个 (before)*100 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll dp[12]; ll Count(ll x,ll k) { ll i =1; ll res =0; ll before = 0, cur=0 ,after =0; while ((x/i)) { cur = (x/i)%10; before = x/(i*10); after = x-(before*10+cur)*i; if(cur == k) res += before*i +after+1; else if(cur < k) res += before*i; else res += (before+1)*i; i*=10; } return res; } ll Count0(ll x) { ll i =1; ll res =0; ll before = 0, cur=0 ,after =0; while ((x/i)) { cur = (x/i)%10; before = x/(i*10); after = x-(before*10+cur)*i; if(cur == 0) res += (before-1)*i +after+1; else res += before*i; i*=10; } return res; } int main () { ll a,b; cin >> a >> b; dp[0] = Count0(b) - Count0(a-1); cout<< dp[0] <<endl; for(int i=1;i<=9;i++){//统计出来1 - 9的数量了 dp[i] = Count(b,i) - Count(a-1,i); cout<< dp[i] <<endl; } //差一个数字0的数量 }