338. 计数问题

#include

using namespace std;

int get(vector<int> num,int l,int r)
{
    int res=0;
    for(int i=l;i>=r;i--)
    {
        res=res*10+num[i];
    }
    return res;
}

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> num;
    
    while(n)
    {
        num.push_back(n%10);
        n/=10;
    }
    n=num.size();
    
    int res=0;
    for(int i=n-1-!x;i>=0;i--)
    {
        if(i<n-1)
        {
            res+=get(num,n-1,i+1)*power10(i);
            if(!x)
            {
                res-=power10(i);
            }
        }
        
        if(num[i]==x)
        {
            res+=get(num,i-1,0)+1;
        }
        else if(num[i]>x)
        {
            res+=power10(i);
        }
    }
    
    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)<<" ";
        }
        puts("");
    }
    
    return 0;
}

分几种情况来进行讨论

以我们要寻找的数字作为分界点,把数字分成两个部分,前面部分可以比较小,前面部分小的话,后面部分可以随便选择

前面部分相等的话,后面部分最大和原来数字相等

power10表示的意思是随便选择的情况数目,比如说有一位可以随便选择就是10,2位就是100,3位就是1000

还有一些细节我还没有想清楚

你可能感兴趣的:(#,acwing算法基础,算法,数据结构)