百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

少儿Python每日一题(8):最大公约数和最小公倍数

itomcoil 2025-01-06 13:21 21 浏览

求两个数的最大公约数和最小公倍数是非常经典的题型。无论是等级考试还是竞赛题中都会出现。此类题目同时多次出现在蓝桥杯、NOC的比赛中以及电子学会、NCT的Python考级原题中,它们的区别仅仅在于是否对算法复杂度有要求,题目还是这个样子。这里就不列举原题了,我们直接来看看如何解决这类问题吧。

一、最大公约数

输入两个正整数m和n,计算出这两个数的最大公约数并输出。

输入:

一行输入两个正整数,以空格隔开

输出:

两个数的最大公约数

输入样例:

12 18

输出样例:

6

这个问题有多种解决方法,最直观的方法我们首先想到的是枚举法。枚举法顾名思义从指定的范围内一个个找到我们需要的答案,找到答案后退出循环。

从数学的知识我们可以知道,我们首先要知道两个数中谁大谁小。最大公约数最大值为较小的数(如3和6的最大公约数),最小值为1(如3和5的最大公约数)。因此我们循环时需要从最大可能性依次减小,一直循环到1。枚举法的代码也很容易得到:

m, n = map(int, input().split())
a = min(m, n) # 求出m和n中的最小值
for i in range(a, 0, -1):
    if m % i == 0 and n % i == 0:
        print(i)
        break

这种方法虽然思路简单,但是并不是最优解。如果输入的数值较小看不出什么问题,假设输入两个十位数的质数,求它们的最大公约数,循环的次数就非常可怕了。因此,如果对算法复杂度有要求,我们就要对算法进行改进了。

我们可以借助于数学上求最大公约数的方法改进我们的算法。在数学上求最大公约数有三个方法:

  1. 找查约数法
  2. 更相减损法
  3. 碾转相除法

第一种方法就是枚举法,第二种和第三种方法如果改造成算法就可以极大减少算法复杂度了。

更相减损法的原理是将两个数的大数减去小数,得到的差再与小数比较,直到差与较小的数相等,则得到的差就是最大公约数。

m, n = map(int, input().split())
while m != n:
    if m > n:
        m = m - n
    else:
        n = n - m
print(m)

碾转相除法的原理是以小的数除大数,所得的是整数,那这个数就是最大公约数,不然就用余数来除刚才的除数,直到得到整数,这时作为除数的就是最大公约数。

m, n = map(int, input().split())
a, b = max(m, n), min(m, n)
c = a % b
while c != 0:
    a = b
    b = c
    c = a % b
print(b)

二、最小公倍数

输入两个正整数m和n,计算出这两个数的最小公倍数并输出。

输入:

一行输入两个正整数,以空格隔开

输出:

两个数的最小公倍数

输入样例:

12 18

输出样例:

36

最小公倍数的问题我们依然可以使用枚举法解决,虽然枚举法不是最佳的答案,但是肯定能解决问题。那么我们要看一下最小公倍数的枚举范围。既然是公倍数,那必然大于等于较大的数,最小的可能就是较大的数(如5和10的最小公倍数),最大的可能是两个数的乘积(如11和13的最小公倍数)。因此我们从最小的可能开始循环,一直循环到两个数的乘积,如果这个数能被这两个数整除,则退出循环。枚举法的代码可以很容易得到:

m, n = map(int, input().split())
a = max(m, n)
for i in range(a, m * n + 1):
    if i % m == 0 and i % n == 0:
        print(i)
        break

同样,在对算法复杂度有要求的情况下,使用枚举算法计算两个大数的最小公倍数效率会显得非常低下。我们看看怎样优化,优化的过程还需要使用到数学的知识:最小公倍数=两个数的乘积÷最大公约数

前面我们讲到了计算最大公约数的时候可以使用更相减损法和辗转相除法。我们借助最大公约数可以很容易得到最小公倍数。下面以借用碾转相除法求最小公倍数的代码(更相减损法思路一样,可以自己书写):

m, n = map(int, input().split())
a, b = max(m, n), min(m, n)
c = a % b
while c != 0:
    a = b
    b = c
    c = a % b
d = m * n // b
print(d)

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...