现在的位置: 首页 > 综合 > 正文

编程之美2.8 找符合条件的整数

2013年06月01日 ⁄ 综合 ⁄ 共 563字 ⁄ 字号 评论关闭

题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0.

 

解决这个问题首先考虑对于任意的N,是否这样的M一定存在。可以证明,M是一定存在的,而且不唯一。

简单证明:

因为

 

这是一个无穷数列,但是数列中的每一项取值范围都在[0, N-1]之间。所以这个无穷数列中间必定存在循环节。即假设有s,t均是正整数,且s<t,有 。于是循环节长度为t-s。于是10^s = 10^t。因此有:
,所以

 

 

剪枝

 

假设对所有的 1,0 组合数字进行搜索 ,则形成一个树

 

                   1

           10          11

     100 101  110 111

...

 

n 层的书,第 k 层树个数  2^(k-1)  假设数字在m层总搜索次数为 o(2^m),改进:

 

假设  x y 为树中两个数  x%M == y%M  ,则 10*x%M == 10*y%M    (10*x+1) %M==(10*y+1)

 

则 假设 x < y 则 y 所在的子树实际上已经剪枝,该子树不需要在考虑了。

 

 

代码暂时没写

扩展问题暂无思考

 

以上来源于

http://yiminghe.javaeye.com/blog/421914

http://www.cnblogs.com/bvbook/archive/2009/02/06/1385448.html

 

抱歉!评论已关闭.