辗转兮好玩

来源:互联网 发布:淘宝商城拍拍网 编辑:程序博客网 时间:2024/04/28 19:23

    不知道什么是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()

原创粉丝点击