统计数字

统计数字

 

Time Limit:   1000MS       Memory Limit:   65535KB
Submissions:   102       Accepted:   15

 

Description
一本书的页码是从自然数1开始顺序编码直到自然数n.书的页码按照通常习惯编排,每个页码都不含多余的前导数字0。例如,第6页用数字6表示,而不是06或006等。数字记数问题要求给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1…..9。

 

Input
输入只有一个数字书的全部页码n(这里1<=n<1000000000)

 

Output
从0到9依次输出这几个数字在页码中出现的次数,每个数字一行。

 

Sample Input

 

999

 

Sample Output

 

0 189
1 300
2 300
3 300
4 300
5 300
6 300
7 300
8 300
9 300

 

Hint
呵呵,n的值给的够大,一部天书啊!

 

解析:

题意很好理解,这里我想写的原因是,分享一种思想,因为这道题的n中任何一位不同,结果就会发生一定变化,那么就对每一位进行讨论,因此从首位开始,用递归就简便多了,最后的结果再减去多加的数,如一开始没讨论的首位为0的情况,代码如下:

 

# include<stdio.h>
# include<math.h>
long long nPage;
long long solve(long long n,int e,int power)
{
    long long hun,th,sum;
    if(power==0)
    {
        if(n>=e)return 1;
        else return 0;
    }
    hun=(int)pow((double)10,(double)power);//得到10的power次方
    th=n/hun;//th相当于高power位所在的数
    if(th<e)
    {
        sum=(th+1)*power*hun/10+solve(n%hun,e,power-1);
    }
    else if(th==e)
    {
        sum=(th+1)*power*hun/10+n%hun+1+solve(n%hun,e,power-1);
    }
    else
    {
        sum=(th+1)*power*hun/10+hun+solve(n%hun,e,power-1);
    }
    return sum;
}
long long Dec(int power,int e)//前面多加的数
{
    if(power==0&&e)return 0;
    else if(power==0&&e==0)return 1;
    else if(e==0)
    return power*(int)pow((double)10,(double)(power-1))+(int)pow((double)10,(double)power)+Dec(power-1,e);//0不能在首位,因此要特殊处理
    else return power*(int)pow((double)10,(double)(power-1))+Dec(power-1,e);
}
int main()
{
    long long sum;
    int i,power;
    scanf("%lld",&nPage);
    for(i=0;i<=9;i++)
    {
        power=(int)log10((double)nPage);//得到nPage的位数
        sum=solve(nPage,i,power)-Dec(power,i);
        printf("%d %lld\n",i,sum);
    }
    return 0;
}

 

 

 

posted on 2013-03-01 22:37  即为将军  阅读(318)  评论(0)    收藏  举报

导航