回 帖 发 新 帖 刷新版面

主题:菜菜有一本很大的书,书一共有N页(0<N≤1000000000)。

菜菜有一本很大的书,书一共有N页(0<N≤1000000000)。 

奇特的是这本书里面一个字都没有。 

有一天菜菜想在每一页的中间都写上该页的页码。 

由于写一个"1"的墨水与写一个"2"的墨水是不同的。 

所以菜菜想知道他到底要写多少个数字"0","1"..."8","9"。 

可是这本书实在是太大了,所以菜菜找到了你来帮他解决这个问题。 

Input
本题有多组数据,每组数据为一个正整数N。 

Output
输出十行整数,分别对应0,1,2,3,4,5,6,7,8,9 

Sample Input
15

Sample Output
1
8
2
2
2
2
1
1
1
1

回复列表 (共11个回复)

沙发


资料盗我的
名字也......

板凳

就是简单的统计,把数字的出现次数定成n[10]
做一个循环吧
页码循环一下,从1到N
每次把当前页码转换成无空格字符串,然后开始while直到这个字符串取空,假设这个字符串是p
while循环的内容:
n[right(p,1)-'0']:=n[right(p,1)-'0']+1
p:=left(p,len(p-1))
这样把页码循环完就可以打印了
如果面对多组数据记得每解决一组就清空一次统计数组

3 楼

我觉得不应该做循环的,n这么大,要超时的。应该把1到100的1有几个,2有几个统计好,再算1。。1000的1有几个,2有几个(由100推出),最后逐步缩小范围。

4 楼

循环是为了确定规律

5 楼

完整的规律我已经大体得出了
记c(k)=10^(k-1)*k
其中,^运算代表乘方,k>=1
k为当前位数-1
把n处理成字符串
依次从字符串尾取得字符转化为一位数a,个位数单独处理。
递推公式是
对于一个数字x<a(除0外),其个数为10^k+x*c(k)
x>a,x*c(k)
x=a,x*c(k)+1
0的个数比较特殊,记0的个数对k-1的个数为z1
则当前k,0的个数为:z1+9*c(k-1)+1+(x-1)*c(k)
依次从低位向高位取,直至把n转换成的字符串取空
注意:当n很大时,x的统计数增量也很大
此时可考虑2维数组存储(第一维标记是对哪个数字进行统计,第二维说明统计数第下标+1位的值)

6 楼


这个时代盗版的太多了,我比较明智换了一个.

7 楼

呵呵 名气大才盗么,看我这么低调就没人盗我的
嘿嘿
由于是盗版id 我就不回答了

8 楼


在说我名气大吗?
[em1]

9 楼

PASCAL的斑竹和版副太可怜了,才这么点分,连我——才来3个月的人都能在分上面把你们全超过去。

现在我是PASCAL上的得分王了(至少我见到的:除了雪光风剑之外没人的分比我高了)。

10 楼

!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册