歐幾里得算法和擴展歐幾里得算法

一、實驗目的及要求

1. 掌握歐幾里得算法和擴展歐幾里得算法的原理

2. 編寫程序實現這兩個算法

 

二、實驗設備(環境)及要求

   PC機, VC++等

三、實驗內容與步驟

1、歐幾里得算法(對代碼中的主要內容進行分析講解)

步驟:

  1. 輸入兩個數a[0],a[1];
  2. 判斷a[0]和a[1]的大小關係,大的改爲a[0],小的改爲a[1];
  3. 利用循環求解gcd(a[0],a[0]%a[1]),直到a[0]%a[1]爲0時結束,這是a[0]就爲最大公約數;
  4. 將a[0]打印出來;

 

2、擴展歐幾里得算法

步驟:

  1. 輸入兩個數a,b;
  2. 判斷a,b的大小關係,大的改爲a,小的改爲b;
  3. 利用遞歸求出a和b的最大公約數:用exojld(b,a%b,x,y)遞歸求解,當a%b爲0是,將x置爲1,y置爲0。
  4. 接着根據公式:

m= *y;
*y = *x-(a/b)*m;

*x = m;

(4)輸出結果。

 

代碼:

//歐幾里得
#include<stdio.h>

int main()
{
	int a[2],temp,m;
	temp = 1;
	printf("請輸入你要輸入的兩個數\n");
	scanf("%d%d",&a[0],&a[1]);
	if(a[1] > a[0])
	{
		m = a[0];
		a[0] = a[1];
		a[1] = m;
	}
	while(temp > 0){
		temp = a[0]%a[1];
		a[0] = a[1];
		a[1] = temp;
	}
	printf("最大公約數%d",a[0]);
	getchar();
	return 0;
}
//擴展歐幾里得
#include<stdio.h>
int exojld(int a,int b,int *x,int *y);
int main()
{
	int a,b,x,y,k; 
	printf("請輸入a,b\n");
	scanf("%d%d",&a,&b);
	if(b > a)
	{
		k = a;
		a = b;
		b = k;
	}
	k = exojld(a,b,&x,&y);
	printf("最大公約數爲%d ,x=%d ,y=%d",k,x,y);
	return 0;
}

int exojld(int a,int b,int *x,int *y)
{
	int temp,m;
	if(b == 0)
	{
		*x = 1;
		*y = 0;
		return a;
	}
	else{
		temp = exojld(b,a%b,x,y);
		m = *y;
		*y = *x-(a/b)*m;
		*x = m;
		return temp;
	}
}

四、實驗結果與數據處理

     1.歐幾里得算法:

         

 

      2.擴展歐幾里得算法

 

 

五、分析與討論

   (1)明白了歐幾里得算法的思想:gcd(a,b) = gcd(b,a mod b);

   (2)明白了擴展歐幾里得算法的定理:如果a、b是整數,那麼一定存在整數x、y使得ax+by=gcd(a,b)以及它的一些規律。

發佈了32 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章