不知道什么是gcd,让我知道了什么是辗转相除。虽然很简单,但是我知道了,高兴了,然后记下来了,happiness可以很simpl嘛!
一、了解下最大公约数中的一些规则。最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf),指某几个整数共有公约数中的最大一个。重要性质:
gcd(a,b)=gcd(b,a)
gcd(a,a)=|a|
gcd(a,0)=|a|
gcd(a,1)=1
gcd(a,b)=gcd(b, a mod b) (important!!!)
gcd(a,b)=gcd(b, a-b)
两个整数的最大公约数主要有两种寻找方法:
* 两数各分解质因子,然后取出同样有的项乘起来
* 辗转相除法
二、辗转相除法。辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至3000年前。它首次出现于欧几里德的《几何原本》(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。
证明:
设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用b除a,得a=bq......r 1(0≤r)。若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。
写成算法:
【递归形式】
function gcd(a, b) {
if b<>0
return gcd(b, a mod b);
else
return a;
}
【纯循环形式】
function gcd(a, b) {
define r as integer;
while b ≠ 0 {
r := a mod b;
a := b;
b := r;
}
return a;
}
用python小语言读取prog0.in中的数对,输出其最大公约数,代码如下:
import sys
def gcd(m,n):
if n==0:return m
else:return gcd(n,m%n)
f=open("E://Topic//Python//sample//prog0.in","r")
s=f.readlines()
i=0
while(i<len(s)):
t=s[i].split(" ")
print gcd(int(t[0]),int(t[1]))
i=i+1
f.close()