我已经在Python中为我的计算机科学课编写了一个分数加法器。但是,我遇到了最终答案减少程序的问题。
该程序在 for 循环的开头使用“不等于”比较运算符!= ,以测试在分割分子和分母时是否会有剩下的。如果将有一个余数(分子%分母≠0),则执行该过程:每个除以 n ,然后 n 递增,为循环再次运行。这种情况一直持续到彼此均匀分配为止。
首先,我收到了语法错误:
python FractionAdder.py 2 4 6 8
File "FractionAdder.py", line 23
for ansnum % n != 0 and ansdenom % n != 0:
^
SyntaxError: invalid syntax
其次, for 循环并不完全健壮。我的目的是让它减少最简单形式的最终答案,但是现在,它只是继续增加 n 并减少直到分子和分母均匀分开。这是一个问题:3均匀分为6,但3/6不是最简单的形式。我可以就如何提高程序的稳健性提出一些建议,以便 n 继续增加并且循环保持循环直到最简单的形式实现? (有没有更好的方法来构建我的条件来实现这个目标?)
完整代码:
import sys
num1 = int(sys.argv[1])
denom1 = int(sys.argv[2])
num2 = int(sys.argv[3])
denom2 = int(sys.argv[4])
n = 1
# Find common denominators and adjust both fractions accordingly.
while denom1 != denom2:
denom1 = denom1 * denom2
num1 = num1 * denom2
denom2 = denom2 * denom1
num2 = num2 * denom2
# Add the numerators and set the ansdenom (denom1 and denom2 should be equal by this point if LCD function worked)
ansnum = num1 + num2
ansdenom = denom1
# Reduce the answer.
n = 2
for ansnum % n != 0 and ansdenom % n != 0:
ansnum = ansnum / n
ansdenom = ansdenom / n
n += 1
print("The sum of the two fractions is:" + str(ansnum) + "//" + str(ansdenom))
提前致谢!
答案 0 :(得分:2)
您看到的错误是由for
的错误用法导出的,其中while
是正确的循环类型(for
用于迭代,while
用于条件)。
然而,你在决定共同点时的逻辑是有缺陷的,并导致无限循环。请阅读least common multiple,并考虑以下伪代码来确定" new" numerators:
lcm = lcm(den1, den2)
num1 *= lcm / den1
num2 *= lcm / den2
答案 1 :(得分:0)
您正在尝试编写一个最大公分母查找器,并且您的终止条件是错误的。 Euclid's Algorithm重复取两个数的模数差,直到结果为0;然后倒数第二个结果是GCD。标准的python实现看起来像
def gcd(a, b):
while b:
a, b = b, a % b
return a
标准库中已有一个实现math.gcd
。
from math import gcd
import sys
def add_fractions(n1, d1, n2, d2):
"""
Return the result of n1/d1 + n2/d2
"""
num = n1 * d2 + n2 * d1
denom = d1 * d2
div = gcd(num, denom)
return num // div, denom // div
if __name__ == "__main__":
if len(sys.argv) != 5:
print("Usage: {} num1 denom1 num2 denom2".format(sys.argv[0]))
else:
n1, d1, n2, d2 = [int(i) for i in sys.argv[1:]]
num, denom = add_fractions(n1, d1, n2, d2)
print("{}/{} + {}/{} = {}/{}".format(n1, d1, n2, d2, num, denom))