您的位置:首页 > 编程语言 > Python开发

最大公约数

2016-07-14 00:00 302 查看
问题描述:

求任意两个整数的最大公约数。

我的代码:

import sys
m=int(raw_input("please input the first number: "))
n=int(raw_input("please input the second number: "))
m,n=max(m,n),min(m,n)
if m%n==0:
print "greatest common divisor is:", n
sys.exit(1)
while True:
if m-n>n:
m=m-n
else:
m,n=n,m-n
if m-n==n:
print "greatest common divisor is:" ,(m-n)
break

我的思路:

我是按照更相减损法算的。

首先如果是44和22等这类的,那么最大公约数就是最小的22了,然后直接退出程序就行了,不必在算了;

如果是其他的,不论是一个奇数和一个偶数,还是两个奇数或偶数(不能整除),如果m-n大于n,那么将m-n的值给m,否则互换,保证最大的数永远给m,最小的数永远给n,这样以后就不需要在判断谁大了,只进行m-n操作即可。最后在每一次比较操作后判断,m-n的值和n值是否相等,如果相等,那m-n就是两数的最大公约数了;

示例代码:

def fun(m, n):
if n > m: m, n = n, m
while True:
m, n = n, m % n
if n == 0: break
return m
print fun(27,18)

示例采用的是辗转相除法,和更相减损法类似,只不过一个是除一个是减;

程序的第一个if语句也是将最大值给m最小值给n,然后让其辗转相除,将每次除的余数给n,原来的n值给m,直到n为0时,说明除到最后了,此时的m值就是两数的最大公约数;

总结:

1.更相减损法

更相减损术则以减数与差相等而得到,辗转相除法体现结果是以相除余数为0则得到;

以27和18为例:

m n m-n

27 18 9

18 9 9

9=9,因此9是27和18的最大公约数;

2.辗转相除法

先求出任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数;

以27和18为例:

m n m%n

27 18 9

18 9 0

9 0

n=0,因此9是27和18的最大公约数

3.如果两个自然数是互质数,那么它们的最大公约数是1;

如果两个自然数中,较大数是较小数的倍数,那么较小数就是这两个数的最大公约数;

题目出处:http://www.cheemoedu.com/exercise/36
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python