一、實驗目的及要求
1. 掌握歐幾里得算法和擴展歐幾里得算法的原理
2. 編寫程序實現這兩個算法
二、實驗設備(環境)及要求
PC機, VC++等
三、實驗內容與步驟
1、歐幾里得算法(對代碼中的主要內容進行分析講解)
步驟:
- 輸入兩個數a[0],a[1];
- 判斷a[0]和a[1]的大小關係,大的改爲a[0],小的改爲a[1];
- 利用循環求解gcd(a[0],a[0]%a[1]),直到a[0]%a[1]爲0時結束,這是a[0]就爲最大公約數;
- 將a[0]打印出來;
2、擴展歐幾里得算法
步驟:
- 輸入兩個數a,b;
- 判斷a,b的大小關係,大的改爲a,小的改爲b;
- 利用遞歸求出a和b的最大公約數:用exojld(b,a%b,x,y)遞歸求解,當a%b爲0是,將x置爲1,y置爲0。
- 接着根據公式:
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)以及它的一些規律。
|