一、实验目的及要求
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)以及它的一些规律。
|