首页
论坛
专栏
课程

[代码之美]题1 提交------新思路

2008-11-21 09:23 4796

[代码之美]题1 提交------新思路

2008-11-21 09:23
4796
花了很多时间想这个,终于给我弄出来了。思路如下:从右起扫描每一个数字,该数字右边的数字为numR,去掉右边后的数字为numL,每一个数字在当前位或更低位出现的次数收到当前数字的大小,numR和numL/10的影响,可以根据他们计算出来。我思路也不是十分清晰,所以弄了很久,表达不清楚具体怎么算,看代码吧。另外0的出现次数要另外多加处理,我原来的就是其他数字的出现次数都算正确,就是0出现问题,今天早上一起来早餐没吃就弄,到现在终于弄出来了。测试过多组数据,如果有谁发现我的程序有问题请指正!

#include<stdio.h>

unsigned a[10]={0,0,0,0,0,0,0,0,0,0}; // 确保范围
void CountEachNum(unsigned num)
{
	unsigned numR,numL,temp,i;
	unsigned flag=1;
	numL=num;
	while(numL!=0)
	{
		numR=num%flag;
		temp=10*flag;
		temp=(num%temp)/flag;
		a[temp]=a[temp]+numR+1;
		if(temp==0)
			a[temp]=a[temp]-flag;

		for(i=1;i<temp;i++)
			a[i]=a[i]+flag;
		for(i=0;i<10;i++)
			a[i]=a[i]+(numL/10)*flag;		
		flag=10*flag;
		numL=num/flag;
	}
}

void main()
{
	FILE *fin,*fout;
	unsigned i,j,k,n,num; 
	if((fin=fopen("in.txt","r"))==NULL)
	{
		printf("Open in.txt ERROR");
		return ;
	}
	if((fout=fopen("out.txt","w"))==NULL)
	{
		printf("Open out.txt ERROR");
		return ;
	}
	fscanf(fin,"%u",&n);
	for(j=0;j<n;j++)
	{
		fscanf(fin,"%u",&num);
		CountEachNum(num);		
		for(i=0;i<10;i++)
			fprintf(fout,"%u  ",a[i]);
		fprintf(fout,"\n");
		for(k=0;k<10;k++) // 清空全局数组
			a[k]=0;
	}
	fclose(fin);
	fclose(fout);
}




2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (0)
游客
登录 | 注册 方可回帖
返回