数字统计问题

#include<stdio.h>
#include<math.h> 

void GetParamater(int a[7][10],int n,int m,int sum0[7]);
void GetSum(int data,int sum[10],int a[7][10]);

int main(){
	int a[7][10] ;
	int data,sum[10],sum0[7];

	GetParamater(a,6,10,sum0);
	//printf("%lf\n",log10(92345));

	while(scanf("%d",&data)){
		GetSum(data,sum,a);
		sum[0]-=sum0[(int)log10(data)+1];
		for(int x=0;x<10;x++){
			printf("%d\n",sum[x]);
		}
	}
	
	return 0;
}

void GetParamater(int a[7][10],int n,int m,int sum0[7]){

	for(int k=0;k<m;k++)
		a[0][k] = 0;
	sum0[0]=0;
	for(int i=1,temp=1;i<=n;i++){
		for(int j=0;j<m;j++){
			a[i][j] = 10*a[i-1][j]+ temp;
			//printf("%d  ",a[i][j]);
		}
		sum0[i]=sum0[i-1]+temp;
		temp *= 10;
		//putchar('\n');
	}
	 
}

void GetSum(int data,int sum[10],int a[7][10]){
	
	for(int i=0;i<10;i++){
		sum[i]=0;
	}
	
	while(data!=0){
		int k = (int)log10(data);
		//表示最高位是多少!
		int p = pow(10,k);
		int high = data/p;
		//printf("k=%d  p=%d  high=%d\n",k,p,high);
		for(int x=0;x<high;x++){
			sum[x]+=p;
			for(int y=0;y<10;y++){
				sum[y]+=a[k][y];
			}
		}
		//printf("data/p  = %d   p=%d\n",data%p+1,p);
		sum[high]+=(data%p+1);
		//printf("sum[high]%d  %d\n",sum[high],high);

		//printf("%d\n",data);
		data%=p;
		p/=10;
	}
	//printf("data=%d\n",data);
}

 

数字统计问题

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

编程任务:给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。编程计算书的全部页码中分别用到多少次数字0129

输入: 每个输入只有1 行,给出表示书的总页码的整数n

输出: 程序运行结束时,输出有10行,在第k行输出页码中用到数字k-1 的次数,k=1210



posted @ 2011-11-12 12:11  Acmen  阅读(385)  评论(0编辑  收藏  举报