100个python算法超详细讲解:分数比较

本文介绍了如何通过通分和求最大公约数的方法比较两个分数的大小,详细阐述了算法步骤,并提供了Python代码实现。程序首先获取用户输入的两个分数,然后计算它们的最大公约数,进一步求得通分后的分子,最后比较分子大小来确定分数的相对大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题描述
比较两个分数的大小。
2.问题分析
人工方式下比较分数大小最常用的方法是:进行分数的通分后比
较分子的大小。通分的步骤可描述如下:
1)先求出原来几个分数(式)的分母的最简公分母。
2)根据分数(式)的基本性质,把原来分数(式)化成以最简公
分母为分母的分数(式)。
例如,比较分数 与  的过程如下:
1)两分数的分母没有公约数,故通分后最简公分母为两分母之
积,即12*7=84。
2)分子为最简公分母除以原来分数的分母再乘以分子,即两分数
的分子分别为84/12*7和84/7*5。
3)通分后两分数分别为 和  ,故  。
若两分数的分母有公约数,则应求出通分后的最简公分母,即两
分母之积/分母的最大公约数。
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.17所示。求最大公约数的流程图参照图4.8。

 5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 分数比较
# 求两个数的最大公约数
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))

6.运行结果
为了验证程序的正确性,对于大于、小于和等于三种情况分别进
行验证,以及分数有无公约数两种情况也分别进行验证,选择的三组
数据分别为4/5与6/7、8/4与16/32、16/32与4/8,运行结果如图4.18所
示。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lee达森

创作不易,感谢打赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值