主题:菜菜有一本很大的书,书一共有N页(0<N≤1000000000)。
编程黑克
[专家分:0] 发布于 2006-12-10 15:34:00
菜菜有一本很大的书,书一共有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个回复)
沙发
编程黑客 [专家分:1660] 发布于 2006-12-10 15:48:00
哼
资料盗我的
名字也......
板凳
雪光风剑 [专家分:27190] 发布于 2006-12-11 07:59:00
就是简单的统计,把数字的出现次数定成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 楼
贺天行宝 [专家分:2300] 发布于 2006-12-12 15:22:00
我觉得不应该做循环的,n这么大,要超时的。应该把1到100的1有几个,2有几个统计好,再算1。。1000的1有几个,2有几个(由100推出),最后逐步缩小范围。
4 楼
雪光风剑 [专家分:27190] 发布于 2006-12-12 22:29:00
循环是为了确定规律
5 楼
雪光风剑 [专家分:27190] 发布于 2006-12-13 09:07:00
完整的规律我已经大体得出了
记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 楼
sss333二代 [专家分:40] 发布于 2007-04-01 17:10:00
这个时代盗版的太多了,我比较明智换了一个.
7 楼
mickeyice [专家分:200] 发布于 2007-04-17 10:01:00
呵呵 名气大才盗么,看我这么低调就没人盗我的
嘿嘿
由于是盗版id 我就不回答了
8 楼
sss333二代 [专家分:40] 发布于 2007-07-10 08:44:00
在说我名气大吗?
[em1]
9 楼
Matodied [专家分:7560] 发布于 2007-07-10 21:39:00
PASCAL的斑竹和版副太可怜了,才这么点分,连我——才来3个月的人都能在分上面把你们全超过去。
现在我是PASCAL上的得分王了(至少我见到的:除了雪光风剑之外没人的分比我高了)。
10 楼
abcwuhang [专家分:1840] 发布于 2007-07-13 14:26:00
!!!
我来回复