1 条题解

  • 0
    @ 2024-12-24 9:49:25

    C :

    //方法3
    #include <stdio.h> 
    int main()
    { 
    	int i,j,a;
    	while((scanf("%d",&a)!=EOF)&&(1<=a&&a<=1000000000)){
    		long int count[10]={0}; 
    		int c,k,s,wei;
    		for(k=s=0,wei=1;a>0;k++,a/=10,wei*=10) 
    		{ 
    			c=a%10;
    			for(i=0;i<10;i++)
    				count[i]+=c*k*(wei/10);
    			for(i=0;i<c;i++)
    				count[i]+=wei;
    			count[c]+=1+s;
    			count[0]-=wei;
    			s+=c*wei;
    		}
    		for(j=0;j<10;j++){
    			printf("%d\n",count[j]);
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    C++ :

    #include <iostream> 
    #include <time.h>
    using namespace std;
    
    int s[10];        //记录0~9出现的次数 
    int a[10];    //a[i]记录n位数的规律 
    
    //l是位数,m是当前处理位(高->低)
    void sum(int n,int l,int m) 
    { 
    	//去除前缀0 
    	if(m==1)
    	{ 
    		int zero=1; 
    		for(int i=0;i<=l;i++)
    		{ 
    			s[0]-=zero;
    			zero*=10;
    		}
    	} 
    	//位数为1位时,出现次数加1
    	if(n<10)
    	{
    		for(int i=0;i<=n;i++)
    		{ 
    			s[i]+=1; 
    		} 
    		return; 
    	}
    	//位数大于1时的出现次数 
    	//计算规律f(n)=n*10^(n-1) 
    	for(int t=1;t<=l;t++)
    	{
    		m=1; 
    		for(int i=1;i<t;i++)m=m*10; 
    		a[t]=t*m; 
    	}
    	//求出输入数为10的n次方 
    	int zero=1; 
    	for(int i=0;i<l;i++)
    	{
    		zero*= 10; 
    	}
    	//求出最高位以后的数 
    	int yushu=n%zero;
    	//求出最高位zuigao
    	int zuigao=n/zero; 
    	//求出0~zuigao-1位的数的出现次数 
    	for(int i=0;i<zuigao;i++)
    	{
    		s[i]+=zero; 
    	}
    	//求出与余数位数相同的0~zuigao-1位中0~9出现的次数 
    	for(int i=0;i<10;i++) 
    	{
    		s[i]+=zuigao*a[l]; 
    	}
    	//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数 
    	//补上所缺的0数,并且最高位加1 
    	if(yushu==0) 
    	{
    		s[zuigao]++; 
    		s[0]+=l; 
    	}
    	else 
    	{
    		int i=0; 
    		while((zero/=10)>yushu) 
    		{
    			i++; 
    		}
    		s[0]+=i*(yushu+1);//补回因作模操作丢失的0 
    		s[zuigao]+=(yushu+1);//补回最高位丢失的数目 
    		sum(yushu,l-i-1,m+1);//处理余位数 
    	}
    }
    
    int main() 
    { 
    	int i,m,n,N,l; 
    	while(cin>>N)
    	{  
    		for(i=0; i<10; ++i)
    		{
    			a[i] = 0;
    			s[i] = 0;
    		}
    		n = N; 
    		//求出N的位数i+1 
    		for(i=0;n>=10;i++) 
    		{ 
    			n/=10; 
    		}
    		l=i; 
    		//cout<<"位数:"<<l<<endl;
    		sum(N,l,1); 
    		for(i=0;i<10;i++) 
    		{ 
    			//cout <<"数字" <<i <<"出现了:"<<s[i]<<"次"<<endl; 
    			cout << s[i] << endl;
    		} 
    		cout << endl;
    	}
    	return 0;
    }
    
    
    • 1

    信息

    ID
    973
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者