笔试遇到的题目中要求两数的最大公约数。
高中的知识,高效又普遍的方法是辗转相除法(欧几里得法)。
辗转相除法的原理:
假设用f(x, y)表示(x),(y)的最大公约数,取k = x/y,b = x%y,则(x = ky + b),
如果一个数能够同时整除(x)和(y),则必能同时整除(b)和(y);而能够同时整除(b)和(y)的数也必能同时整除(x)和(y),
即(x)和(y)的公约数与(b)和(y)的公约数是相同的,其最大公约数也是相同的,则有f(x, y)= f(y, x%y)(y > 0),
如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。
#coding=utf8
#求最大公约数
#辗转相除法
def gcd(a,b):
if a<b:
a,b=b,a
while b!=0:
temp=a%b
a=b
b=temp
return a
if __name__ == '__main__':
print gcd(100,105)