1206: 数字统计
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 8 Solved: 3
[ Submit][ Status][ Web Board]
Description
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,
每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数
字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,
2,…,9。
Input
给出表示书的总页码的整数n(1≤n≤2^31-1)
Output
输出10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。
Sample Input
11
Sample Output
1
4
1
1
1
1
1
1
1
1
HINT
Source
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
ll b[10] = { 1, 10, 100, 1000, 10000, 100000, 1000000,10000000, 100000000, 1000000000};
ll count_num ( ll n, ll id )
{
ll left, m, sum = 0;
for ( int i = 1; i < 12; i++ )
{
left = n / b[i] - (id==0);
sum += left * b[i-1];
m = (n % b[i] - n % b[i-1]) / b[i-1]; //求出从第到高的第i位上的具体数字
if ( m > id ) sum += b[i-1];
else if ( m == id ) sum += n % b[i-1] + 1;
if ( n < b[i] ) break;
}
return sum;
}
int main()
{
ll n,m,f;
ll a[10];
int i;
cin>>n;
//{
for(i=0;i<=9;i++)
{
a[i]=count_num(n,i)-count_num(0,i);
}
for(i=0;i<=9;i++)
{
cout<<a[i]<<endl;
}
//}
}