Python算法100例-4.7 分数比较

完整源代码项目地址,关注博主私信'源代码'后可获取

1.问题描述

比较两个分数的大小。

2.问题分析

人工方式下比较分数大小最常用的方法是:进行分数的通分后比较分子的大小。通分的步骤可描述如下:

1)先求出原来几个分数(式)的分母的最简公分母。

2)根据分数(式)的基本性质,把原来分数(式)化成以最简公分母为分母的分数(式)。

例如,比较分数 7 12 \frac{7}{12} 127 5 7 \frac{5}{7} 75 的过程如下:

1)两分数的分母没有公约数,故通分后最简公分母为两分母之积,即12*7=84。

2)分子为最简公分母除以原来分数的分母再乘以分子,即两分数的分子分别为84/127和84/75。

3)通分后两分数分别为 49 84 \frac{49}{84} 8449 60 84 \frac{60}{84} 8460,故 7 12 \frac{7}{12} 127< 5 7 \frac{5}{7} 75

若两分数的分母有公约数,则应求出通分后的最简公分母,即两分母之积/分母的最大公约数。

3.算法分析

由上述分析可知,求通分后的最简公分母,就是求两分母的最小公倍数。求最小公倍数的前提是求出两数的最大公约数,最大公约数的求解可采用辗转相除法,步骤如下:

1)用较大的数m除以较小的数n,得到的余数存储到变量b中,即b=m%n。

2)第1步中较小的除数n和得出的余数b构成新的一对数,并分别赋值给m和n,继续做上面的除法。

3)若余数为0,其中较小的数(即除数)就是最大公约数;否则重复步骤1和步骤2。

对于最大公约数的求解用自定义函数common_divisor(a,b)实现,程序代码如下:

# 求两个数的最大公约数
def common_divisor(a, b):
    # 若a < b,则交换两变量的值
    if a < b:
        temp = a
        a = b
        b =temp
    # 求分母a和b的最大公约数
    c = a * b
    while b != 0:
        d = b
        b = a % b
        a = d
    return c // a


通分后的分子为:通分后的分母/原分数分母*原分数分子。两分数的分母分别用变量j和l表示,分子用变量i和k表示,则求解分子的代码如下:

m = common_divisor(j, l) // j * i               # 求出第一个分数通分后的分子
n = common_divisor(j, l) // l * k               # 求出第二个分数通分后的分子

只需比较变量m、n的值即可,若m>n则第一个分数大于第二个分数;若m=n,两分数相等;否则第一个分数小于第二个分数。

4.程序框架

程序流程图如图所示。求最大公约数的流程图参照图4.8。

在这里插入图片描述

5.完整的程序

根据上面的分析,编写程序如下:

# 分数比较

# 求两个数的最大公约数
def common_divisor(a, b):
    # 若a < b,则交换两变量的值
    if a < b:
        temp = a
        a = b
        b = temp
    # 求分母a和b的最大公约数
    c = a * b
    while b != 0:
        d = b
        b = a % b
        a = d
    return c // a


if __name__ == "__main__":
    print("请分别输入两个分数:")
    i, j = [int(i) for i in input("请输入第一个分数: ").split()]
    k, l = [int(i) for i in input("请输入第二个分数: ").split()]
    print("第一个分数:%d/%d" %(i, j))
    print("第二个分数:%d/%d" %(k, l))
    m = common_divisor(j, l) // j * i       # 求出第一个分数通分后的分子
    n = common_divisor(j, l) // l * k       # 求出第二个分数通分后的分子
    if m > n:
        print("%d/%d > %d/%d" %(i,j,k,l))
    else:
        if m == n:
            print("%d/%d = %d/%d" %(i,j,k,l))
        else:
            print("%d/%d < %d/%d" %(i,j,k,l))
请分别输入两个分数:
第一个分数:4/5
第二个分数:6/7
4/5 < 6/7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘逸高铁侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值