每个页面不含前导0,即第6页 为8 而不是06或006,
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int numbers(int n)
{
// if(n==1)
// return 1;
// else
// return 10*numbers(n-1)+pow(10,n-1);
if(n<=1)
return 1;
else
return n*pow(10,n-1);
}
int Number_bit(int Num)
{
if(Num<10)
return 1;
return Number_bit(Num/10)+1;
}
int pagesNumber(int pages,int *a,int *bit,int n,int bits)//n
{
if(n == 1)
{
for (int i = 1; i <= bit[bits-1]; ++i)
{
a[ i ] += 1;
}
return 0;
}
else
{
int tmp = numbers(n-1) * (bit[bits-n]);
for (int i =0; i < 10; ++i)
{
a[i] += tmp;
}
for (int i = 1; i < bit[bits-n] ; ++i)
{
a[ bit[bits-n]-i ] += pow(10,n-1); //
}
tmp = pages % (int)pow(10,n-1);//
a[ bit[bits-n] ] += ++tmp;
int t= Number_bit(--tmp);
return pagesNumber(tmp,a,bit,t,bits);
}
}
int main(){
int pages;
int Num[10];
std::memset(Num, 0, sizeof(Num));
cin>>pages;
int n = Number_bit(pages);
int adjust = 0;
int *bit = new int[n];
for (int i = 0,tmp = pages; i < n; ++i) //bit
{
bit[n-i-1] = tmp%10;
tmp /= 10;
if(bit[n-i-1]==0&&i!=0){
adjust += pow(10,i)-1;
}
}
//adjust 调整0
// 将1000 ->300 => 300-99-9 =192
// 1045 ->304 => 304-100+1-45 = 250
int flag = -1;
if(adjust!=0)
for(int i=0;i<n;i++){
if(bit[i]==0)
flag=i;
if(flag !=-1){
adjust -= bit[i]*pow(10,n-i-1);
}
}
pagesNumber(pages,&Num[0], bit, n, n);
Num[0]-=adjust;
for(int i = 0;i<10;i++){
cout<<Num[i]<<endl;
}
return 0;
}