⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 count.cpp

📁 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排
💻 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 + -