欧几里得算法和扩展欧几里得算法

一、实验目的及要求

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章