$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. count(n, x) 含义:1 ~ n 中数字 x 出现的次数
2. 假设一个数为 abcdefg,分析 x 在 1 ~ abcdefg 在 d 位出现的次数
3. 若前三个数为 000 ~ abc - 1 且 x != 0,则后三个数可为 000 ~ 999,总次数为 abc * 1000
4. 若前三个数为 001 ~ abc - 1 且 x == 0,则后三个数可为 000 ~ 999,总次数为 (abc - 1) * 1000
5. 若前三个数为 abc 且 x > d,则无解
6. 若前三个数为 abc 且 x == d,则后三个数可为 000 ~ efg,总次数为 efg + 1
7. 若前三个数为 abc 且 x < d,则后三个数可为 000 ~ 999,总次数为 1000
完整代码
#include<bits/stdc++.h>
using namespace std;
int get(vector<int> nums,int l,int r)
{
int res=0;
for(int i=l;i>=r;i--) res=res*10+nums[i];
return res;
}
// 10 ^ x
int power10(int x)
{
int res=1;
while(x--) res*=10;
return res;
}
int count(int n,int x)
{
if(!n) return 0;
vector<int> nums;
while(n)
{
nums.push_back(n%10);
n/=10;
}
n=nums.size();
int res=0;
for(int i=n-1-!x;i>=0;i--)
{
if(i<n-1)
{
res+=get(nums,n-1,i+1)*power10(i); //abc * 1000
if(!x) res-=power10(i); //(abc - 1) * 1000
}
if(nums[i]==x) res+=get(nums,i-1,0)+1; //efg + 1
else if(nums[i]>x) res+=power10(i); //1000
}
return res;
}
int main()
{
int a,b;
while(cin>>a>>b,a||b)
{
if(a>b) swap(a,b);
for(int i=0;i<10;i++)
cout<<count(b,i)-count(a-1,i)<<' ';
cout<<endl;
}
return 0;
}