您的位置:首页 > 其它

统计数字问题

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;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: