我已经实现了Greedy算法来解决埃及分数,但是我得到了一些意想不到的结果。这是我的代码
from math import ceil
from fractions import Fraction
def go(frac):
ret = []
while frac > 0:
if frac.numerator == 1:
ret.append(frac)
break
x = Fraction(1, ceil(frac.denominator / frac.numerator))
frac -= x
ret.append(x)
return ret
input1 = int(raw_input('numerator: '))
input2 = int(raw_input('denominator: '))
print go(Fraction(input1, input2))
我经常收到错误“TypeError:两个参数都应该是Rational实例”
我一直在记录,并在while循环的第一次迭代时崩溃。
编辑:详细错误是:
File "egypt.py", line 19, in <module>
print go(Fraction(input1, input2))
File "egypt.py", line 10, in go
x = Fraction(1,ceil(frac.denominator / frac.numerator))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fractions.py", line 158, in __new__
raise TypeError("both arguments should be "
TypeError: both arguments should be Rational instances
这是为什么? 谢谢。
答案 0 :(得分:2)
您的代码中有2个问题。
int
与int
分开,int
总是返回a / b
;在您的情况下,您将a < b
除以ceil()
,因此它总是向下舍入为0. float
返回一个Fraction
(0.0)int
不喜欢的内容;它需要Fraction(1, int(ceil(float(frac.denominator) / frac.numerator)))
s。所以试试这个:
{{1}}
其余代码看起来不错。
答案 1 :(得分:0)
尝试更改此内容:
x = Fraction(1, ceil(frac.denominator / frac.numerator))
到此:
x = Fraction(1,int(ceil(frac.denominator / float(frac.numerator))))