各个数位都不含9的所有8位数的倒数和是多少( 二 )



■网友
MATLAB代码:
tic;nums = str2num(dec2base(base2dec(\u0026#39;10000000\u0026#39;, 9):base2dec(\u0026#39;88888888\u0026#39;, 9), 9));sum(1./nums)toc;ans = 1.07145231728767时间已过 11.725852 秒。速度并不快, 速度快的参考 @Falccm 的答案, 主要注重的是原理.
10进制下, 阿拉伯数字总共有10个(0, 1, 2, 3, 4, 5, 6 ,7, 8, 9), 现在少了一个, 而且是最末尾的"9", 那不就变成了9进制了吗?
罗列出所有的8位9进制数字, 就能得到结果了.
第一个8位9进制数字是\u0026#39;10000000\u0026#39;
【各个数位都不含9的所有8位数的倒数和是多少】 最后一个8位9进制数字是\u0026#39;88888888\u0026#39;

■网友
#!/usr/bin/env python# vim: set fileencoding=utf-8 :from __future__ import (unicode_literals, absolute_import, division, print_function)from itertools import productdef return_sum(): s = 0 for t in product("012345678", repeat=7): for prefix in "12345678": s += 1/int(prefix+"".join(t)) return sif __name__ == \u0026#39;__main__\u0026#39;: print(return_sum())效率还可以嘛,为啥要想更复杂难懂的算法?In : %time return_sum()CPU times: user 23 s, sys: 0 ns, total: 23 sWall time: 23 sOut: 1.07145231728757UPDATE:原来用的是`itertools.combinations_with_replacement`,正确的应该是`itertools.product`
■网友
Mathematica version,可计算不定位数,不过对于8位以上需要大内存:f:=1.~Divide~Nest]\u0026amp;,Range@8,n-1]~Total~-1; f//AbsoluteTimingOutput:{0.907086, 1.0714523172876624}
■网友
筛法稍微变通一下就行了呗。定义bool flaghigh对应高4位,flaglow对应低4位初始值为true从0开始每次递增9遍历一次,所有遍历到的值置为false,可以排除1位和5位为9的数字然后是同理的90递增900递增9000递增排除2/6,3/7,4/8位为9的然后每个数如果高4位对应的flag和低4位对应的flag都为真时则不含9PS:为了容易理解所以定义了两个数组,其实他俩的数据是一样的,定义一个就够用了。这方法说白了就是空间换时间,对于较大的数字通过设标志位的方式简化计算步骤。缺点是太耗空间,上面的例子如果定义一个flag会更省计算时间,就是空间实在太大了。嗯,刚刚想起来,还有一种变种的方式。int count;number从0开始递增,每次count加1,当count为9时将目前数字排除并且count加1,count归零当count为9时count加1,count归零,同时number在递增加1的基础上再加(10-1)以此类推:当count为9时count加1,count归零,同时number在之前基础上再加(10^i-1)直到count = 9;事实上count对应的就是第i位的数据,当某位为9时跳过该数字段即可。
■网友
泻药,本来已经决定不再回答这些问题。。。我也不知道为什么@孙一帆的答案明明是至今最好的,却无甚么人认可。哎,就如我不知村头母猪为何上树一样。不多说了,附上我的懒人代码。其中的算法和孙一帆的最后半段是不谋而合的。number = 10 ** 7number_list = * 8number_list = 1s = 0.0while number \u0026lt; 10 ** 8 - 1: d = -1 while d \u0026gt;= -8: if number_list == 8: number_list = 0 if d == -1: number += 10 ** (-d - 1) * 2 else: number += 10 ** (-d - 1) d -= 1 elif number_list \u0026lt; 8: number_list += 1 if d == -1: number += 1 break s += 1.0 / numberprint s


推荐阅读