分数约分-第11届蓝桥杯选拔赛Python真题精选

2023-12-16 18:35:55

[导读]:超平老师的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 = 1b = 2c = 3

当然,我们也可以直接用一行代码来简化,如下:

a, b, c = 1, 2, 3

实际上,还有一种特殊的赋值方式,如下:

a,?b,?c?=?[1,?2,?3]

当一个集合类型(包括列表、元组和集合)赋值给多个变量的时候,多个变量是依次获取指定下标位置的值。

运行程序,输入27,30,效果如下:

图片

输入36,6效果如下:

图片

至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果。

四.总结与思考

本题的分数为25分,代码在15行左右,涉及到的知识点包括:

  • 循环语句,主要for...in循环;

  • 条件语句;

  • 输入和输出处理;

  • 运算符,重点是%、//和and等;

  • 函数的定义及使用;

题目难度中等,难点有两个,一是从题目的描述中分析出最大公约数这个关键点,二是如何计算两个整数的最大公约数。

超平老师给你留一道思考题,除了上面讲到的枚举算法外,还有3种更高效的方法,你知道是怎么实现的么,超平老师后续还会专门进行分析讲解的。

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以移步至“超平的编程课”gzh。

文章来源:https://blog.csdn.net/diamondwang2012/article/details/135035268
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。