辗转相除Euclid
- 设a, b为两个自然数,欲求a, b的最大公约数
- 若a%b为0,则b就是a, b的最大公约数,计算结束
- 否则令a为b,而b为原来的a%b,重复步骤2
a, b = map(int, input().split()) while True: r = a%b if r==0: break a = b b = r print(b)
辗转相除Euclid
为方便实现代码,做一点变形:
- 设a, b为两个自然数,欲求a, b的最大公约数
- 若b为0,则a就是a, b的最大公约数,计算结束
- 否则令a为b,而b为原来的a%b,重复步骤2
a, b = map(int, input().split()) while True: if b==0: break r = a%b a = b b = r print(a)
变形之后,代码可以进一步简化:
a, b = map(int, input().split()) while True: if b==0: break #r = a%b #a = b #b = r a, b = b, a%b print(a)
还可以进一步变形:
a, b = map(int, input().split()) #while True: # if b==0: # break while b: a, b = b, a%b print(a)
再次进行优化:
while b > 0: a, b = b, a % b
- 有必要先判断x和y的大小,保证进入循环的时候,x是较大的数吗?