辗转相除法的证明
描述
给出两个整数 a
和 b
,请计算 a
和 b
的最大公约数,通过 print
语句输出。
1≤b≤a≤1000
样例
评测机将通过执行命令 python main.py {a} {b}
来执行你的代码,并将 a
和 b
作为命令行参数传入。
样例一
当 a = 15
, b = 12
时,程序执行打印出的结果为:
3
样例二
当 a = 10
, b = 7
时,程序执行打印出的结果为:
1
挑战
你可以用时间复杂度比 O(n)
更小的方法来解决该问题吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 | import sys a = int (sys.argv[ 1 ]) b = int (sys.argv[ 2 ]) # write your code here # please print the greatest common divisor of a and b def gcd(a, b): if a % b = = 0 : return b return gcd(b, a % b) print (gcd(a, b)) |
如何证明辗转相除法的正确呢???
我自己想到的一个思路,假设a,b的最大公约数是k,则有a=mk, b=nk;当然,m<n
为了找到k,采用mk%nk=?k,?肯定是小于n的,如果能够使用迭代算法,让?=1,则两个求余结果就是k,也就是要找的最大公约数了。
好,迭代如下:
mk%nk=?k
nk%?k=??k
?k%??k=???k
??%???k=....
则?一直迭代下去肯定会为1。因为两个不断变小的整数相除求余一定会迭代终止,终止条件势必被除数是1.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-06-03 AES中的ECB、CTR、MAC、GMAC、GCM
2020-06-03 数字签名算法-RSA、DSA、ECDSA、ECDH
2020-06-03 常用的数字签名算法包括:MD5withRSA/SHA1withRSA/SHA256withRSA/SHA1withDSA/SHA256withDSA/SHA512withDSA/ECDSA等
2018-06-03 leetcode 643. Maximum Average Subarray I
2018-06-03 leetcode 38. Count and Say
2018-06-03 太深了,梯度传不下去,于是有了highway。 干脆连highway的参数都不要,直接变残差,于是有了ResNet。 强行稳定参数的均值和方差,于是有了BatchNorm。RNN梯度不稳定,于是加几个通路和门控,于是有了LSTM。 LSTM简化一下,有了GRU。
2017-06-03 python nltk 入门demo