最大公約數

2021-09-12 04:05:47 字數 2925 閱讀 4865

**1.**執行最大公約數的常用演算法,並新增異常處理模組(如輸入非法等)。在基礎程式的基礎上,可以考慮手動輸入所有數字或者利用隨機數產生數字,分別加入異常處理模組。

*注:隨機數的產生方法

srand()的作用是提供乙個種子。然後呼叫rand(),其格式為int rand(void)。它會根據提供給srand()的種子值返回乙個隨機數(在0到32767之間),我們可以根據自己的需要通過運算來改變範圍。time()函式的作用則是產生乙個正整數。此處要注意標頭檔案的宣告#include

**2.**在此程式中,主要採取四種求最大公約數的演算法:輾轉相除法,窮舉法,更相減損法,stein法.

**3.**最主要的是要考慮如何儲存資料的問題,在這裡,我採用了二維陣列進行資料儲存。

**4.**為了使程式優化,在程式中新增了在給定不同規模測試資料的情況下求平均執行時間的函式,這裡就用到了時間函式。

*注 計算時間函式clock(): 捕捉從程式開始執行到clock()被呼叫時所耗費的時間。定義start,end來計算時間差。

clock_t start,end;

start=clock( );

end=clock(); //結束計時

time1=(double)(end-start)/clocks_per_sec;

printf(「耗時%fms\n」,time1);

#include#include#include#include//求時間的標頭檔案

#define max 1000 //定義最大組數

int hanshu(int a,int b) //輾轉相除法(函式巢狀呼叫)

return (temp); //返回滿足條件的數到主調函式處

} int geng(int a,int b)

if(ax)?b:x; //所得的差與較小的數比較

b=(b>1,b);

else

return stein(a>>1,b>>1)<<1;

}if(~b&1)

return stein(a,b>>1);

if(a>b)

return stein((a-b)>>1,b);

return stein((b-a)>>1,a);

}int main( )

srand(time(null)); //隨機種子

for(i=0;i1.此處為手動輸入的異常處理(由於此處演算法都是針對正整數而言,因此當存在負數提示輸入不合法)

2.此部分為隨機產生數(此處處理主要針對陣列的最大容量)

1.除錯:

2.測試:

(1)輾轉相除法:

編寫**對函式一進行功能測試,由截圖可知,輾轉相除法求最大公約數功能可以實現

(2)窮舉法:

編寫窮舉法的函式部分**,求出最大公約數及消耗時間,結果表明,此功能正常。

(3)更相減損法:

(4)stein法:

以上四種測試結果表明,測試的四部分函式編寫無誤,並能正確得出相應時間,輸出元素部分利用了隨機函式,由執行結果可知,隨機數的產生部分能夠正常執行。二維陣列中的資料也能正確的傳入函式。

3.執行結果:

(1)測試組數定為五組:

對五組資料用不同的四種方法求最大公約數,並比較耗時。

(2)設定相應的比較組數為10組

以下截圖為10組數求最大公約數的四種不同方法

(3)此處設定組數20組

(4)此處設定組數為30組

從不同組數的資料耗時可看出,隨著資料的增多,求最大公約數最短耗時為輾轉相除法

1.通過求最大公約數的程式編寫,掌握了基本的四種演算法思維,使程式更具優化性。在此處對四種演算法選擇方面採取了switch語句,方便清晰。

2.利用二維陣列儲存相應的資料,不會是資料錯亂,方便輸入資料,方便進行比較和運算。

3.在此次編寫程式中我還出現了乙個低階錯誤,就是在多個迴圈語句中重複使用同一變數,導致報錯,因此,在寫程式的過程中,要隨相關變數進行正確的注釋,避免重複。

4.標頭檔案的宣告也是最為重要的,也是最容易忽視的。其中需要我們再次掌握的還是隨機函式rand()的應用以及計算耗時的函式。srand(time(null)); //隨機種子

最大公約數

最大公因數 greatest common divisor 也稱最大公約數 最大公因子,指兩個或多個整數共有約數中最大的乙個。a,b的最大公約數記為 a,b 同樣的,a,b,c的最大公約數記為 a,b,c 多個整數的最大公約數也有同樣的記號。求最大公約數有多種方法,常見的有質因數分解法 短除法 輾轉...

最大公約數

求兩數的最大公約數 簡單嗎?簡單!用多種方法求,可以嗎?emmmmm.應該可以吧?相信絕大多數人都知道求最大公約數的如下 所示的這種方法 include includeint commondivisor int x,int y min return min int main 先判斷兩個數的大小,將較...

最大公約數

題目傳送門 題目意思是x和y的最大公約數是素數,假設有乙個素數p 即k 1 p xk1 p x k1 p xk2 p y k2 p y k2 p y 我們可以看到當要使x和y的最大公約數是p,那麼k1和k2必須是互質的。那麼我們可以列舉1 n的所有質數,對於每個質數p,它的最大係數為n p,那麼對於...