统计数字问题
(1)、问题描述
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。
(2)、算法设计
给定表示书的总页码的10 进制整数n (1≤n≤10 ) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
题解1.暴力求解
#include <stdio.h>
#include <stdlib.h>
int main()
{
int c[10] = {0};
int m,n,i;
scanf("%d",&n);
for(m=1;m<=n;m++)
{
int tmp = m;
while(tmp)
{
c[tmp%10]++;
tmp = tmp/10;
}
}
for(i=0;i<=9;i++)
{
printf("%d\n",c[i]);
}
return 0;
}
题解2.递归
#include <stdio.h>
#include <stdlib.h>
void Countshu(int page,int num[]);
int wei(int n); //计算最高位是多少
int maxzui(int n); //最高位数字是多少
int yushu(int n); //除去最高位,余数是多少
int fn(int n); //计算0-9相同次数
int zero(int n); //计算多余0的个数
int main()
{
int page,i;
while(1)
{
printf("输入页数");
scanf("%d",&page);
if(page==0)
break;
int num[10]={0};
Countshu(page,num);
for(i=0;i<=9;i++)
{
printf("%d\n",num[i]);
}
}
}
int wei(int n)
{
int a=0;
while(n)
{
n/=10;
a++;
}
return a;
}
int maxzui(int n)
{
return n/(int)pow(10,wei(n)-1);
}
int yushu(int n)
{
return n%(int)pow(10,wei(n)-1);
}
int fn(int n)
{
return n*(int)pow(10.0,n-1);
}
int zero(int n)
{
return (1-(int)pow(10.0,wei(n)))/(1-10);
}
void Countshu(int page,int num[])
{
int i;
int n = wei(page);
int m = maxzui(page);
int m1 = yushu(page);
int x = fn(n-1);
for(i=0;i<=9;i++)
{
num[i]+=x*m;
}
for(i=0;i<m;i++)
{
num[i]+=(int)pow(10.0,n-1);
}
num[m]+=m1+1;
num[0]+=(n-wei(m1)-1)*(m1+1);
if(m1==0)
return;
else
Countshu(m1,num);
}