统计数字问题的算法看不是很懂
统计数字问题
问题描述:
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
给定表示书的总页码的10进制数 n (1£n£10 9)。计算书的全部页码中分别用到多少次数字0,1,2,…,9。
数据输入:
输入有若干组数据,每组仅一行,每行有一个整数,表示给出表示书的总页码的整数n。
结果输出:
对输入中的每行上的页数,输出一行,该行有10个数组成,其第k个数是页码中用到数字k-1的次数,之间空一格,k=1,2,…,10。
输入样例
11
输出样例
1 4 1 1 1 1 1 1 1 1
代码如下,请问Num函数的算法是怎样的,不是很看得懂?求大牛指教
#include <iostream>
#include <memory.h>
using namespace std;
void Num(int sn[10] ,int n)
{
int i,c,k,s,p;
memset(sn,0,10*sizeof(int));
for(k=s=0 ,p =1; n>0 ; k++ , n/=10 ,p *= 10)
{
c=n%10;
for(i=0 ; i <10 ; i++)
{
sn[i] +=c*k*(p/10);
}
for(i=0; i<c ;i++)
{
sn[i] += p;
}
sn[c] += 1+s;
sn[0] -= p;
s+=c*p;
}
}
int main()
{
int sn[10];
int pages;
while(cin>>pages){
Num(sn,pages);
for(int j =0; j<10 ; j++)
{
cout<<sn[j];
if(j!=9)cout<<" ";
}
cout<<endl;
}
return 0;
}