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

python 判断16种风向 python判断分数_python

 若两分数的分母有公约数,则应求出通分后的最简公分母,即两
分母之积/分母的最大公约数。
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。

python 判断16种风向 python判断分数_python 判断16种风向_02

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所
示。

python 判断16种风向 python判断分数_算法_03