演算法設計與分析之求兩個數的最大公約數
題目:給定兩個自然數m,n,求他們的最大公約數。
三種演算法及其思想:
蠻力法:
思想:
逐個嘗試2-min{m,n},找到的最大的數即為m和n的最大公約數;如果沒找到,則m和n的最大公約數為1.
虛擬碼描述:
輸入:兩個自然數 m,n
輸出:m和n的最大公約數
1.factor=1;
2.迴圈變數i從2~min{m,n},執行下述操作:
2.1 如果i是m和n的公因子,執行下述操作:
2.2.1 factor=factor*i;
2.2.2 m=m/i;n=n/i;
2.2 如果i不是m和n的公因子,則i=i+1;
3.輸出factor
C語言:
#include
int main()
{
int m,n;
printf("請輸入兩個自然數");
scanf("%d %d",&m,&n);
int CommFactor1{
int i,factor=1;
for(i=2;i<=m && i<=n;i++)
{
while(m%i==0 && n%i==0)
{
factor=factor*i;
m=m/i;n=n/i;
}
}
printf("m和n的公因數為%d\n",factor);
}
CommFactor1(m,n);
return 0;
}
輸出結果:
歐幾里得演算法(輾轉相除法)
思想:
定理:兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數
虛擬碼描述:
輸入:兩個自然數 m,n
輸出:m和n的最大公約數
1.r=m%n
2.迴圈直到i=0
2.1 m=n
2.2 n=r
2.3 r=m%n
3.輸出n
c語言:
#include<stdio.h>
int main()
{
int m,n;
printf("請輸入兩個正整數:");
scanf("%d %d",&m,&n);
int CommFactor2(){
int r= m%n;
while(r !=0)
{
m=n;
n=r;
r=m%n;
}
printf("最大公約數是為%d\n",n);
}
CommFactor2(m,n);
}
輸出結果:
相減法
思想:
在歐幾里得演算法的思想中,把除法換成減法
虛擬碼描述:
輸入:兩個自然數 m,n
輸出:m和n的最大公約數
1.先m-n是否為0,若不為0,執行2;若為0,則輸出其中的一個,即為公約數
2.r=m-n;m=n;n=r;(m>n);再執行1
C語言:
#include<stdio.h>
int main()
{
int m,n;
printf("請輸入兩個正整數:");
scanf("%d %d",&m,&n);
if(m==n)
printf("最大公約數為%d",m);
while(m!=n)
if(m>n)
{
m=m-n;
}
else
{
n=n-m;
}
printf("最大公約數是為%d\n",n);
}
輸出結果:
三種演算法的時間複雜度分析:
歐幾里得演算法所用時間最短,蠻力法所用時間最長(不適用於資料較大的情況)。