Python - 定义分数

Python - Defining fraction

使用Python定义命名分数 在不使用 import 和 return 的情况下定义 using 函数,格式为 a/b 示例

fraction(9,24) result = > 3/8

我的英语不是很好所以我真的不知道分数到底是什么。 我的学校只用我国家的语言教学。

def fraction(a,b):
    return a ? b ?
fraction(9,24)

没有分数模块,调用 factorise(9,24) 将 return a_ret 为 3,b_ret 为 8。

def prime_factors(n):
    i = 2
    factors = []
    while i * i <= n:
        if n % i:
            i += 1
        else:
            n //= i
            factors.append(i)
    if n > 1:
        factors.append(n)
    return factors

def factorise(a,b):
    a_list = prime_factors(a)
    a1_list = a_list
    b_list = prime_factors(b)
    b1_list = b_list
    for x in a_list:
        if x in b1_list: 
            b1_list.remove(x) 
            a1_list.remove(x)
    for x in b_list:
        if x in a1_list: 
            a1_list.remove(x)
            b1_list.remove(x) 
    a_ret = 1
    b_ret = 1
    for x in a1_list:
        a_ret *= x
    for x in b1_list:
        b_ret *= x
    print(a_ret,b_ret)

分数是写成 a/b 的数字,因此小数 0.4 等于分数 4/10 等于简化的(最简单的)分数 2/5

有多种方法可以满足您的需求。最简单的可能是使用 fractions.Fraction class(尽管如果这是学校练习,这可能被认为是作弊):

from fractions import Fraction

def fraction(a, b):
    ''' return simplest fraction as a string of the form a/b '''
    fr = Fraction(a, b)
    return '{}/{}'.format(fr.numerator, fr.denominator)

示例:

fraction(9, 27) # --> '1/3'

不使用fractions模块,直接计算greatest common divisor of a and b and divide both numbers by that to "normalize" the fraction即可。

def fraction(a, b):
    g = gcd(a, b)
    return "%d / %d" % (a // g, b // g)

示例:

>>> gcd(9, 24)
3
>>> fraction(9, 24)
'3 / 8'

gcd 的实施留作 reader(或使用 math.gcd

的练习

我们可以通过查看是否有达到最小值的任何数字将两者相除来找到分数的最简化形式 - 然后我们可以递归调用分数以处理进一步的迭代:

def fraction( numerator, denominator):
    min_val = min(numerator, denominator)
    # We go from 2 -> min_val here, 
    # skipping 1 because every number is divisible by one and it gets us nowhere
    for divisor in range(2, min_val+1):
        if (numerator % divisor == 0 and denominator % divisor == 0):
            # We know the fraction can be reduced, 
            # because divisor divides both numerator and denominator
            return(fraction(numerator / divisor, denominator / divisor))
    return('{}/{}'.format(numerator, denominator))

测试输出:

>>> fraction(5, 10)
'1/2'

如果你有任何问题,请告诉我,递归有时有点奇怪,但它很强大,让我们的生活变得更简单