辗转相除法的证明
描述
给出两个整数 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) 更小的方法来解决该问题吗?
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.

浙公网安备 33010602011771号