python - Python中的埃及分数,而循环没有测试足够高的单位分数
问题描述
from fractions import Fraction
n = 103
d = 104
nd = Fraction(n, d)
d1 = 1
while nd != 0:
d1 = d1 + 1
if Fraction(1, d1) <= nd:
testfrac = Fraction(1, d1)
nd = nd - testfrac
print(testfrac)
试图计算埃及分数。它适用于更平滑的计算,但当 while 循环必须继续测试更高的数字时效率不够。while 循环将继续运行但最终停止,并且不会测试此计算的最后两个部分。d1 是否有最大数量?
解决方案
您应该查看其他算法,以了解人们如何在合理的时间内解决这些问题。我发现 Rosettacode.org 上的 Python 实现非常快。这是基于那边的一个最小版本:
from fractions import Fraction
from math import ceil
def ef(fr):
ans = []
if fr >= 1:
if fr.denominator == 1:
return [[int(fr)], Fr(0, 1)]
intfr = int(fr)
ans, fr = [[intfr]], fr - intfr
x, y = fr.numerator, fr.denominator
while x != 1:
ans.append(Fraction(1, ceil(1/fr)))
fr = Fraction(-y % x, y* ceil(1/fr))
x, y = fr.numerator, fr.denominator
ans.append(fr)
return ans
ef(Fraction(2,3))
ef(Fraction(5,8))
ef(Fraction(103,104))
对于任何分数,计算时间都是一眨眼的功夫。
推荐阅读
- selenium - 如何解决 TestNG 中的 org.testng.internal.reflect.MethodMatcherException?
- jpa - EclipseLink:初始化期间未找到规范元模型类
- python - 如何使用条件计算熊猫中的不同值计数?
- jquery - 使用 jQuery .replaceWIth 添加动态内容
- angular - 在 Angular 5 中的 ngoninit 之后如何运行函数
- php - 使用 DOMDocument 将表的内容添加到数组中
- powershell - 使用 PnPPowershell SP2016 创建发布 HTML 站点列
- flutter - 有谁知道为什么在 GestureDetector 中触发 onLongPress 事件后,flutter 无法触发 onVerticalDragUpdate 事件
- java - 点燃返回本地运行reduce查询失败
- python - 多字符串列映射和清理