📄 count.cpp
字号:
#include<iostream.h>
#include<math.h>
#include <fstream.h>
unsigned int a[10];
unsigned int count_weishu(unsigned int m)
{
unsigned int n;
n=0;
while(m>0)//计算多少位
{
m=m/10;
n++;
}
return n;
}
void count(unsigned int m,unsigned int n,unsigned int r)//数m,位数n,m取模后的余数r
{
unsigned int i,k,n1,f,w,m1,r1;
n1=0;//n1是余数r的位数
n1=count_weishu(r);//计算余数的位数
if(r==0)
{//能够被10整除
a[0]=a[0]+n-1;
return;
}
a[0]=a[0]+(r+1)*(n-n1-1);//计算中间差的0的个数,要乘以余数+1
if(r<10)
{
for(i=0;i<=r;i++)
a[i]++;
return;
}
w=(unsigned int)pow(10,n1-1);
m1=r;
k=m1/w;//取余数的最高位
r1=m1%w;//取余数的余数
f=(unsigned int)((n1-1)*pow(10,n1-2));//计算X000-X999中的每个数的个数
for(i=0;i<10;i++)
{
a[i]=a[i]+f*k;
if(i<k)
{
a[i]=a[i]+w;
}
}
a[k]=a[k]+r1+1;
count(m1,n1,r1);
}
void main()
{
ifstream in ("input.txt");
ofstream out("output.txt");
unsigned int m,i,k,n,f,r,w;
in>>m;
n=0;
k=m;
if(m<10)
{
for(i=1;i<=m;i++)
a[i]++;
}
else
{
n=count_weishu(m);
// cout<<"m的位数:"<<n<<endl;
w=(unsigned int)pow(10,n-1);
// cout<<"10的n-1次方:"<<w<<endl;
k=m/w;
// cout<<"最高位:"<<k<<endl;
r=m%w;
//cout<<"余数是:"<<r<<endl;
f=(unsigned int)((n-1)*pow(10,n-2));
// cout<<"n-1位中0-9数字的个数:"<<f<<endl;
for(i=0;i<10;i++)
{
a[i]=a[i]+f*k;
if(i<k)
{
a[i]=a[i]+w;
}
}
a[0]=a[0]-w-(w-1)/9;
a[k]=a[k]+r+1;
count(m,n,r);
}
for(i=0;i<10;i++)
out<<a[i]<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -