这个简单的Python分数加法器不是完全健壮的并且正在收到错误。怎么改进?

时间:2017-09-14 23:21:32

标签: python math stored-procedures console arithmetic-expressions

我已经在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))

提前致谢!

2 个答案:

答案 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))