花了很多时间想这个,终于给我弄出来了。思路如下:从右起扫描每一个数字,该数字右边的数字为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);
}
上传的附件 test.rar