Chinaunix首页 | 论坛 | 博客
  • 博客访问: 503296
  • 博文数量: 35
  • 博客积分: 3472
  • 博客等级: 中校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-04 06:54
文章分类
文章存档

2014年(4)

2013年(2)

2011年(3)

2010年(9)

2009年(9)

2008年(8)

分类: 其他平台

2008-05-11 11:53:10

摘自算法设计与实验题解 算法实现题1-1

一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。



==================== 上题分析 =====================
Parasitic Number - 把一个多位数的最后一位提到第一位后这个数是原数的两倍求原数

一、比较笨的一个推理方法

因为最后一位提到前面后与原数为二倍关系,但是总位数不变
所以可以设最后一位最小为2,前面一位数为后面位数的二倍,进位保留在更前面的一位上;
则当计算到第一位为1,且第二位小于5时所得到的数既为所求,过程如下:
.................2
................42
...............842
..............6842
.............36842
............736842
...........4736842
..........94736842
.........894736842
........7894736842
.......57894736842
......157894736842
.....3157894736842
....63157894736842
...263157894736842
..5263157894736842
.05263157894736842
105263157894736842
以上数字,最后一位为2,正好是第一位1的2倍,且第二位0小于5,所以满足设定得解。
所以所有以105263157894736842为循环节的数都满足这个要求。

另外,所有满足“最后一位为第一位的2倍,且第二位小于5”这个设定的数都满足题目要求。
如:
315789473684210526
210526315789473684
421052631578947368等等...

二、数学推理
从上可知这样的数称为Parasitic Number,定义为:

An n-parasitic number for n=2~9, is a such that, when by n, the of the result is the same as for the original , except with the rightmost moved to the front. In other words, the decimal representation undergoes a right circular shift by one place.
一个n阶parasitic number是指这样的自然数,把它乘以n以后得到的数恰好就是把它的个位数拿到最前面得到的数。

本题实际上就是求2阶的parasitic number。

设此数为10x+y,y为个位数,x为此数其余部分,再设p为此数的位数,则p=(lgx)+1,根据题意可知:
(10^p)*y + x = n *(10*x + y)

x = ((10^p - n)*y) / (10n-1)
原数为10x+y, 得: 10x + y = ((10^q -1) * y) / (10n-1)

注意这里有三个未知数,q是此数的位数+1,y是个位数,n是题目中的n(本题为2)。wiki和转载的一些文章好像是把y也写作n了

对于给定的n,我们必须寻找这样的数字,9, 99, 999, ...,从中找出其能够被 (10n-1)/y整除的。比如5, 10-1=49,因为49只有7,1,49这三个因子,所以必须必须找到能够整除7或者49的数,通过尝试即可得到

按照上的说法应该更简单了, 因为y/(10n-1)是循环小数,可以表示为类似z*0.000100010001...的形式,其中z是循环节,而另一部分中0的个数就是循环节的长度。另外我们注意到1/9, 1/99, 1/999,...恰好也是类似的形式,所以y/(10n-1)可以表示为z/(10^p - ),其中p为循环节的长度。这样求解就变得非常简单

下面是最小的n阶parasitic number

n Smallest n-parasitic number
2 105263157894736842
3 1034482758620689655172413793
4 102564
5
6 10169491525423728813559932203389830508474576271186440677966
7 1014492753623188405797
8 1012658227848
9 10112359550561797752808988764044943820224719







阅读(3204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~