1. 程式人生 > >輾轉相除法、相減法求兩自然數最大公約數和最小公倍數

輾轉相除法、相減法求兩自然數最大公約數和最小公倍數

l 輾轉相除法

演算法描述:

輾轉相除法是求兩個正整數的最大公約數的一種演算法.

有兩整數ab

 ① a%b得餘數c

 ② 若c=0,則b即為兩數的最大公約數

 ③ 若c0,則a=bb=c,再回去執行①

 例如求2715的最大公約數過程為:

  27÷151215÷12312÷30因此,3即為最大公約數

資料流程圖:

演算法的數學證明:

證明輾轉相除法的確可以求得最大公約數,只需證明gcd(a,b)=gcd(b,a%b).

證明:定義a=k*b+r ,k=a/b , r=a%b

假設一個數da,b的一個公約數,表示為d|ad|b,意為a能被d整除同時b也能被b整除.-->

所以d|(k*b+r) --> 再加上因為d|b,也就是說d|k*b -->所以d|r ,d|(a%b) -->所以d也是ba%b的公約數-->最終得a,b的公約數也就是b,a%b的公約數,故而gcd(a,b)=gcd(b,a%b) .

兩個數的最小公倍數等於他們的乘積除以最大公約數.

C#程式碼實現:

迴圈:

Console.WriteLine ("輸入兩個正整數(輸入一個敲下回車): ");
int num1 = int.Parse (Console.ReadLine ());
int num2 = int.Parse (Console.ReadLine ()); 
int temp = num1*num2,r;
do{
    r = num1 % num2;
    num1 = num2;
    num2 = r;
   }while(r>0);
Console.WriteLine ("最大公約數是{0} ",num1);
Console.WriteLine ("最小公倍數是{0} ",temp/num1);

遞迴:

public static int gcd (int a, int b)
    {
     	return (b==0?a:gcd(b,a%b));
    } 

l 輾轉相減法

輾轉相減法與輾轉相減法相似

演算法描述

     有兩整數ab
                 a>b,則a=a-b
                 a<b,則b=b-a
                 a=b,則a(或b)即為兩數的最大公約數
                 ab,則再回去執行①
                 例如求2715的最大公約數過程為:

                271512( 15>12 ) 15123( 12>3 )
               1239( 9>3 ) 936( 6>3 )
                633( 3==3 )
                因此,3即為最大公約數

程式碼實現

int temp = num1*num2;
while(num1!=num2)
  {
   if (num1 > num2)
      num1 -= num2;
   else
      num2 -= num1;
   }
Console.WriteLine ("最大公約數是{0} ",num1);
Console.WriteLine ("最小公倍數是{0} ",temp/num1);