天天看點

zoj 3622 Magic Number(找規律)

唉………………寫的相當的亂,狀态十分不好。

可以求每個數前面有多少個magic number,然後相減即可。

#include<iostream>
#include<cmath>
using namespace std;

int num(int x)
{
    int sum=0;
    while(x>0)
    {
        sum++;
        x/=10;
    }
    return sum-3;
}

double pow(int b)
{
    double s=1;
    for(int i=1; i<=b; i++)
        s*=10;
    return s;

}
int solve(int x)
{
    int s=0;
    if(x==1)
        return 1;
    
    s=log10(x);
    if(int(pow(s))==x)
    {
        if(x==10||x==100)
            return s*4;
        else
            return s*5-2;
    }
    if(x<10)
    {
        if(x>=5)
            s+=3;
        else if(x>=2)
            s+=2;
        else if(x>=1)
            s+=1;

    }
    else if(x<100)
    {
        s*=4;
        if(x>=50)
            s+=3;
        else if(x>=25)
            s+=2;
        else if(x>=20)
            s+=1;
    }
    else
    {
        int n=num(x);
        s=5*s-2;
        if(x>=500*pow(n))
        {
            s+=4;
        }
        else if(x>=250*pow(n))
            s+=3;
        else if(x>=200*pow(n))
            s+=2;
        else if(x>=125)
            s+=1;
    }
    return s;
}

int main()
{
    int m,n;
    while(cin>>m>>n)
    {
        int km,kn;
        if(m>n)
            swap(m,n);
        if(m==1)
        {
            km=1;
            kn=solve(n);
            cout<<kn-km+1<<endl;
            continue;
        }
        else
            km=solve(m-1);
        kn=solve(n);
        cout<<kn-km<<endl;
    }
    return 0;
}