最大公約數簡便演算法 求最大公約數的4種演算法

2021-10-13 03:47:26 字數 3006 閱讀 6617

for(z=0; z<10000000; z++) 迴圈只是為了增加程式的執行時間,讓我們體會演算法的時間複雜度。

演算法一:短除法

想法,採用短除法找出2個數的所有公約數,將這些公因子相乘,結果就是2個數的最大公約數。【找公因子,只能使用蠻力法】

#include

#include

void main()

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

for(z=0; z<10000000; z++)

for(i=2;i<=m&&i<=n;)

while(m%i==0&&n%i==0)

f*=i;

m/=i;

n/=i;

i++;

finish=clock();

duration=(double)(finish-start)/clocks_per_sec;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

image.png

演算法二:輾轉相除法

輾轉相除法, 又名歐幾里德演算法(euclidean algorithm),是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。

#include

#include

void main()

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

for(z=0; z<10000000; z++)

if(m

i=m;

m=n;

n=i;

i=m%n;

while(i)

m=n;

n=i;

i=m%n;

f=n;

finish=clock();

duration=(double)(finish-start)/clocks_per_sec;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

time=0.037000 seconds

result=4

press any key to continue

演算法三:蠻力法,從2個公約數中較小的數開始遞減,二個公約數除以它,可以同時除盡,變是最大公約數,我想的,很笨的一種。

#include

#include

void main()

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

for(z=0; z<10000000; z++)

f=m>n?n:m;

for(i=f;i>0;i--)

if(m%i==0&&n%i==0)

f=i;

break;

finish=clock();

duration=(double)(finish-start)/clocks_per_sec;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

time=0.992000 seconds

result=4

press any key to continue

演算法四:輾轉相減法

輾轉相減法是一種簡便的求出兩數最大公約數的方法。(更相減損術)輾轉相減法(求最大公約數),即尼考曼徹斯法,其特色是做一系列減法,從而求得最大公約數。例如 :兩個自然數35和14,用大數減去小數,(35,14)->(21,14)->(7,14),此時,7小於14,要做一次交換,把14作為被減數,即(14,7)->(7,7),再做一次相減,結果為0,這樣也就求出了最大公約數7

#include

#include

void exchange(int *m,int *n);

void main()

int m=28,n=72;

int i,f=1;

int z;

clock_t start,finish;

double duration;

start= clock();

if(m

exchange(&m,&n);

for(z=0; z<10000000; z++)

i=m-n;

while(i)

if(i>n)

m=i;

}else

m=n;

n=i;

i=m-n;

f=m;

finish=clock();

duration=(double)(finish-start)/clocks_per_sec;

printf("time=%lf seconds\n",duration);

printf("result=%d\n",f);

void exchange(int *m,int *n)

int temp;

temp=*m;

*m=*n;

*n=temp;

time=0.020000 seconds

result=4

press any key to continue

看看4個演算法的執行時間,還是我自己想的演算法時間最久,來乙個

大神拯救我吧。

最大公約數簡便演算法 最大公約數演算法

1 查詢約數法 先分別找出每個數的所有約數,再從兩個數的約數中找出公有的約數,其中最大的乙個就是 最大公約數 例如,求 12 和 30 的最大公約數 12 的約數有 1 2 3 4 6 12 30 的約數有 1 2 3 5 6 10 15 30 12 和 30 的公約數有 1 2 3 6,其中 6 ...

求最大公約數

最新用了三種演算法實現了求最大公約數的演算法,用的c 寫的,最大公約數也是我們生活中常見的問題 1 窮舉法 主要 如下 if a b for i 1 i a i 演算法分析 窮舉法先將a,b兩值比較大小並且互換,再進行與各種數的整除,如果這個數能同時被a,b整除,那麼這個數就為最大公約數,這種演算法...

求最大公約數

暴力列舉法很簡單,從較小整數的一班開始,試圖找到乙個合適的整數i,檢查這個整數i是否被a和b同時整除 暴力列舉法求最大公約數 param a param b return public static int getgreatestcommondivisor v1 int a,int b for in...