[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第20讲。
分数约分,本题是2020年1月12日举办的第11届蓝桥杯青少组Python编程选拔赛真题,题目要求编写程序对给定的分数进行约分。
先来看看题目的要求吧。
一.题目说明
编程实现:
约分是把分数化成最简分数的过程,约分后分数的值不变,且分子分母的最大公约数为1,若最终结果的分母为1,则直接用整数表示。
提示:
两个以逗号分隔输入的整数,可以采用如下方法进行转换、分离:
str = input()
nums = eval(str)
输入描述:
输入两个正整数(以逗号分隔)分别作为分数的分子和分母。
输出描述:
第一行显示输入的分数;
第二行显示约分后的最简分数 ,若分母为1,直接用整数表示。
样例输入1:
27,30
样例输出1:
27/30
9/10
样例输入2:
36,6
样例输出2:
36/6
6
评判标准:
下列各评分项单独计分,得分累加,共25个计分点。
-
6分:能接收输入的信息,在第一行正确显示输入的分数,格式符合样例;
-
9分:至少针对一个输入,能输出正确的最简分数,输出格式符合样例;
-
10分:针对裁判指定所有样例的输入,都能输出正确的最简分数,旦输出格式符合样例。
二.思路分析
这是一道和数学相关的算法题,考查的知识点包括循环和数学运算。
题目要求对两个整数构成的分数进行约分,那什么是约分呢,约分的依据又是什么呢?
把分数简化成最简分数的过程就叫约分,例如27 / 30这是一个分数,27可以写成3 * 9,30可以写成3 * 10,那么27 / 30可以写成 9/ 10,这里的公因子3被同时约掉了。
把一个分数的分子、分母同时除以公约数,分数的值保持不变。
约分时,如果能很快找到分子和分母的最大公约数,直接用它们的最大公约数去除就可以了。
所以,本题的重点是如何计算两个整数的最大公约数,英文是Greatest Common Divisor,简称GCD。
求解最大公约数是编程学科中的典型问题,方法也比较多,常见的解法有如下4种:
-
枚举算法
-
欧几里得算法
-
更相减损法
-
Stein算法
其中,枚举算法是最简单的,其基本思路可以分为如下3个步骤:
1). 找到两个数字中的较小者,从而确定循环范围,假设为从n到1;
2). 从n开始,判断两个数字是否能被n整除,如果是,则n就是最大公约数,结束循环,否则转到3);
3). 将n减1,重复步骤2)。
其流程图如下所示:
为了方便,我们可以将计算最大公约数的过程定义成函数,调用该函数时,传入两个整数,返回它们的最大公约数。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分两步来编写程序:
-
定义函数计算最大公约数
-
对分数进行约分
1. 定义函数计算最大公约数
根据前面的分析,定义函数如下:
代码不多,强调4点:
1). 交换两个变量,在Python编程中不需要使用临时变量,直接使用x,y = y,y即可,这是Python独有的特性,非常方便;
2). 在循环的时候,需要从x到1,因此range()函数的参数,必须要写上-1;
3). 函数中的return语句有两个作用,一是返回值,二是结束函数;
4). 任何两个整数的最小公约数是1。
2. 对分数进行约分
有了函数,接下来就简单了,先获取输入的a和b,然后调用函数计算出最大公约数,接着将a和b都除以最大公约数,就可以得到约分后的结果了。
不过,分母有可能出现1的情况,此时需要额外判断一下,具体代码如下:
上面的代码不难理解,需要说明的是获取a和b的值时,用到了列表推导式和多变量赋值的编程技巧。
在Python中,多变量赋值的基本写法如下:
a = 1
b = 2
c = 3
当然,我们也可以直接用一行代码来简化,如下:
a, b, c = 1, 2, 3
实际上,还有一种特殊的赋值方式,如下:
a, b, c = [1, 2, 3]
当一个集合类型(包括列表、元组和集合)赋值给多个变量的时候,多个变量是依次获取指定下标位置的值。
运行程序,输入27,30,效果如下:
输入36,6效果如下:
至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果。
四.总结与思考
本题的分数为25分,代码在15行左右,涉及到的知识点包括:
-
循环语句,主要for...in循环;
-
条件语句;
-
输入和输出处理;
-
运算符,重点是%、//和and等;
-
函数的定义及使用;
题目难度中等,难点有两个,一是从题目的描述中分析出最大公约数这个关键点,二是如何计算两个整数的最大公约数。
超平老师给你留一道思考题,除了上面讲到的枚举算法外,还有3种更高效的方法,你知道是怎么实现的么,超平老师后续还会专门进行分析讲解的。
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。