统计数字问题
2012-06-22 20:47
246 查看
参考资料:http://blog.csdn.net/jcwKyl/article/details/3009244
#include<iostream> #include<cstring> #include<cmath> using namespace std; /*f(n)=10f(n-1)+10^(n-1) 推导出 f(n)=n*10^(n-1)*/ int main() { int i,len,n,tempn,templen; int pow[10]; int temp=1; int highNum; int count[10]; memset(count,0,sizeof(count)); for(i=0;i<10;i++)//用于计算pow { pow[i]=temp; temp=temp*10; } scanf("%d",&n); i=1; len=1; while(n>=pow[i]) { len++; i++; } tempn=n; templen=len; while(templen>1) { highNum=tempn/pow[templen-1]; for(i=0;i<10;i++) { count[i]+=highNum*(templen-1)*pow[templen-2];//算出除了最高位时已经出现的次数,如n=34567时,那么在00000--29999时出现了3个 4*10^(3) } for(i=0;i<highNum;i++)//算最高位 0 1 2出现的次数 { count[i]+=pow[templen-1]; } tempn=tempn%pow[templen-1];//算出除了最高位剩下的数 count[highNum] += tempn+1;//最高位3出现的次数 templen--; } for(i=0;i<=tempn;i++) { count[i]++; } //去前导的0 for(i=0;i<len;i++) { count[0] -= pow[i]; } for(i=0;i<10;i++) { printf("%d\n",count[i]); } return 0; }