计算机算法设计与分析(第5版)1—1统计数字问题

**问题描述:**一本书的页码从自然数1开始顺序编码到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6页用数字6表示而不是06或006等。数字计数问题要求对给定书的总页码n,计算书的全部页码分别用到多少次数字0,1,2,…,9。

#include
#include
typedef struct{
	int elem;
}SqList,*table;
void yiweishu(table &num,int n)
{
	int i;
	for(i=1;i<=n;i++)
		num[i].elem=num[i].elem+1;
}
void liangweishu(table &num,int n)
{
	int i,m,k;
	m=n/10;
	k=n%10;
	for(i=1;i<=m;i++)
		yiweishu(num,9);
	for(i=1;i<=m-1;i++)
		num[i].elem=num[i].elem+10;
	num[m].elem=num[m].elem+k+1;
	yiweishu(num,k);
	num[0].elem=num[0].elem+m;
}
void sanweishu(table &num,int n)
{
	int i,x,y;
	x=n/100;
	y=n%100;
	for(i=1;i<=x;i++)
		liangweishu(num,99);
	for(i=1;i<=x-1;i++)
		num[i].elem=num[i].elem+100;
	num[x].elem=num[x].elem+y+1;
	liangweishu(num,y);
	num[0].elem=num[0].elem+2*x;
}
int main()
{
	int i,j;
	int n;
	//定义,申请存储空间并初始化
	table num;
	num=(SqList*)malloc(sizeof(SqList)*10);
	for(i=0;i<10;i++)
		num[i].elem=0;
	//基本的填数操作
	FILE *fp=fopen("input.txt","r");
	if(fp){
		fscanf(fp,"%d",&n);               
		fclose(fp);
	}else{
		printf("打开失败");
	}
	//我这个程序只能算到三位数到999
	if(n<=0)
		printf("worry");
	else if(n<10)
		yiweishu(num,n);
	else if(n<100)
		liangweishu(num,n);
	else if(n<1000)
		sanweishu(num,n);
	for(i=0;i<=9;i++)
		printf("%d\t",num[i].elem);
	system("pause");
}

你可能感兴趣的:(算法设计分析1-1)