从错误中学python(4)——最小公约数与辗转相除法
来源:互联网 发布:js 禁止div滚动条事件 编辑:程序博客网 时间:2024/06/05 13:04
题目
给你两个正整数a和b, 输出它们的最大公约数
辗转相除法
辗转相除法的步骤
def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd(b,a)
即就是取如果b与a不能整除,就取a和b除以a的余数再考察是个递归的思路。
理解
可以从两个角度去理解辗转相除法
1.举例法
一张长方形纸,长2703厘米,宽1113厘米.要把它截成若干个同样大小的正方形,纸张不能有剩余且正方形的边长要尽可能大.问:这样的正方形的边长是多少厘米?
解答:
可知:在长2703厘米、宽1113厘米的长方形纸的一端,依次裁去以宽(1113厘米)为边长的正方形2个。在裁后剩下的长1113厘米,宽477厘米的长方形中,再裁去以宽(477厘米)为边长的正方形2个。然后又在裁剩下的长方形(长477厘米,宽159厘米)中,以159厘米为边长裁正方形,恰好裁成3个,且无剩余。因此可知,159厘米是477厘米、1113厘米和2703厘米的约数。所以裁成同样大的,且边长尽可能长的正方形的边长应是159厘米。所以,159厘米是2703和1113的最大公约数。
让我们把过程转化为计算过程,即:
2703÷1113,商2余477;
1113÷477,商2余159;
477÷159,商3余0。
当余数为0时,最后一个算式中的除数159就是原来两个数2703和1113的最大公约数。
可见,477=159×3,
1113=159×3×2+159=159×7,
2703=159×7×2+477=159×7×2+159×3=159×17。
又∵7和17是互质数,
∴159是2703和1113的最大公约数。
我们把这种求最大公约数的方法叫做辗转相除法.辗转相除法的优点在于它能在较短的时间内求出任意两个数的最大公约数。
2.公式理解法
b=ak+r;如果一个数能整除a和r,那么一定能整除b
python解法
def gcd(b,a): b,a=a,b%a if a==0: return b else: return gcd(b,a)print(gcd(a,b))
这个解法已经很长了,但是有解法还要判断a与b谁大谁小,其实是很没有必要的。因为取余数后还是一样的。这里我们这篇文章的名字叫从错误中学python,并不是说这种解法错了,而是说不够简洁。不能体现出Python的优越性。
循环法
这里我们使用循环来代替前面的递归
while(b%a!=0): a,b=b%a,aprint(a)
这样就简洁多了
列表法
只有一行代码,使用max()函数;我认为是比较简洁的,但是效率很低。时间复杂度高。
print(max([i for i in range(1,b+1) if b%i==0 and a%i==0]))
- 从错误中学python(4)——最小公约数与辗转相除法
- 最小公约数-辗转相除法&stein算法
- 求两个数字的最大公倍数与最小公约数,辗转相除法
- 辗转相除法求最小公约数和最小公倍数
- 辗转相除法求公约数
- 辗转相除法,求公约数和公倍数.
- 辗转相除法求公约数和公倍数
- 【阿里2015校招面试算法题】辗转相除法求最小公约数
- 求最小公约数(辗转相除法<递归和非递归求法>)
- 求最大公约数与最小公倍数——辗转相除法
- 质数与合数系列——辗转相除法
- nyoj-40 公约数和公倍数【辗转相除法】
- 辗转相除法算一些较大数之间的公约数
- 欧几里得算法,也称辗转相除法,求公约数
- 从错误中学python(1) —— 规范化英文名字
- 从错误中学python(3)——求素数
- 求最大公约数——辗转相除法
- 辗转相除法求最大公约数最小倍数
- 个人的尚学堂数据库oracle笔记(1)
- Java 集合Map --16
- 活学活用wxPython -> 给你的wxPython程序一个稳固的基础
- 黑马程序员——ios基础---C语言:字符串、指针
- HDU 5399 Too Simple
- 从错误中学python(4)——最小公约数与辗转相除法
- 实现矩阵类
- 字符串中连续出现最多的子串 & 字符串中最长重复子串
- Nginx监控脚本
- IOS学习之Foundation框架—集合
- linux系统下sublime text编译运行c++程序的配置文件
- c++32位系统和64位系统中类型的字节区别
- 浅谈ANR及如何分析解决ANR
- HDU5400 Arithmetic Sequence 数学题