使分数计算器代码更优化的技巧(更快,使用更少的内存)

2024-10-01 11:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我需要的程序做的是作为一个简单的分数计算器(加减乘除),为一行输入,例如:
-输入:1/7 + 3/5
-输出:26/35

我的初始代码:

import sys

def euclid(numA, numB):
    while numB != 0:
        numRem = numA % numB
        numA = numB
        numB = numRem
    return numA

for wejscie in sys.stdin:
    wyjscie = wejscie.split(' ')
    a, b = [int(x) for x in wyjscie[0].split("/")]
    c, d = [int(x) for x in wyjscie[2].split("/")]
    if wyjscie[1] == '+':
        licz = a * d + b * c
        mian= b * d
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
    elif wyjscie[1] == '-':
        licz= a * d - b * c
        mian= b * d
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
    elif wyjscie[1] == '*':
        licz= a * c
        mian= b * d
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)
    else:
        licz= a * d
        mian= b * c
        nwd = euclid(licz, mian)
        konA = licz/nwd
        konB = mian/nwd
        wynik = str(konA) + '/' + str(konB)
        print(wynik)

我把它简化为:

^{pr2}$

欢迎就如何改善这一状况提出任何建议。在

编辑:还有一件事我忘了提——除了sys,代码不能使用任何库。在


Tags: inforsysprintnumaeuclidstrnumb
3条回答

可能最大的改进是使用Python(2.6)的^{}库:

>>> import fractions
>>> fractions.Fraction(1,7) + fractions.Fraction("3/5")
Fraction(26, 35)

你可以把把分数从单个的“+”、“-”等中减少到最低的代码,这样可以使代码更简洁、更简洁、易读。在

我将创建一个包含numeratordenominator字段(两个整数)并实现__add____sub____mul__和{}方法。然后您可以简单地使用普通的数学函数来组合实例。在

对于您的目的来说,这可能会有点过分,但是代码会更干净。在

实际上,基于类的方法正是fractions模块的实现方式。通常,我建议检查分数模块的源代码,看看它是如何编写的,但由于这是家庭作业,所以我不确定这是否允许。可能值得在赋值结束后检查一下,看看一个完整的分数类型是如何实现的。在

相关问题 更多 >