三種不同的演算法求兩個自然數的最大公約數

2021-10-09 08:37:18 字數 1044 閱讀 7388

一、實驗目的

1.熟悉演算法求解問題的過程

2.練習使用不同演算法求解同一問題,並對演算法進行分析

二、實驗內容

1.使用三種不同的演算法求兩個自然數的最大公約數。

2. 對三種演算法的時間複雜度進行分析。

第一種:歐幾里得輾轉相除法偽**描述:

if m第二種:輾轉相減法偽**描述:

if m第三種:窮舉法偽**描述

if m運算結果

答:

//歐幾里得遞迴演算法(輾轉相除法)

void

euclid

(int m,

int n)

int r;

while

(true

)else}}

//輾轉相減法

void

subtraction

(int m,

int n)

int temp;

while

(m-n!=0)

} cout<<

"最大公約數:"

<}//窮舉法

void

exhaustive

(int m,

int n)

while

(m%n!=0)

cout<<

"最大公約數:"

<}//測試

intmain()

演算法分析

答:(1)歐幾里得輾轉相除法:已知斐波納契數列增長速度是指數,那麼待分析的數列也是指數增長,設歐幾里得演算法需要k次,那麼n=o(2^k),則k=o(lg n).

所以歐幾里得演算法求最大公約數的時間複雜度是對數量級的,速度非常快,為k=o(lgn)

(2)輾轉相減法:根據演算法,m-n!=0,則m>n,分析while迴圈的執行次數可知,當n=m-n即m=2n時執行次數最大為2n,故輾轉相減法的時間複雜度為o(2n)

(3)窮舉法:除數為n時,每次n減一,最壞執行n次,則可知窮舉法的時間複雜度為o(n)

分析不是做的很好,可能有錯誤!還希望有識之士能夠指正,不勝感激!

Java求兩個自然數的最大公約數

1 遞減法,時間複雜度有點高 o n public class maximum private static string getcommonnum integer a,integer b if a.compareto b 0 else int c b while c 1 c c從b開始遞減 ret...

求自然數的組合數的回溯演算法

自然數的組合數處理標頭檔案 組合數的回溯演算法 內容 完成組合數的回溯演算法 內容 完成二叉樹的前,中序遍歷 非遞迴 內容 完成查詢二叉樹的靜,動態查詢 非遞迴 include stdlib.h define maxn 100 int number maxn 自然數的組合數回溯演算法comb bac...

求自然數的組合數的回溯演算法

自然數的組合數處理標頭檔案 組合數的回溯演算法 內容 完成組合數的回溯演算法 內容 完成二叉樹的前,中序遍歷 非遞迴 內容 完成查詢二叉樹的靜,動態查詢 非遞迴 include stdlib.h define maxn 100 int number maxn 自然數的組合數回溯演算法comb bac...