二.扩展欧几里得算法:
1.扩展的欧几里得算法描述:
输入:两个非负整数a,b,且a>=b;
输出:d=gcd(a,b)与满足ax+by=d的整数x与y.
1).若b==0,则d=a,x=1,y=0,返回(d,x,y);
2).设x2=1,x1=0,y2=0,y1=1;
3).当b>0时,做如下操作:
3.1)mod=a%b;
3.2)r=a-mod*b,a=b,b=r;
3.3)x=x2-mod*x1,x2=x1,x1=x;
3.4)y=y2-mod*y1,y2=y1,y1=y;
4).令d=a,x=x2,y=y2,并返回(d,x,y)。
2.代码如下:
#include<stdio.h>
void input(int &a,int &b)
{
int data1,data2;
scanf("%d,%d",&a,&b);
}void Extend_Euclid_gcd (int max,int min,int &d,int &x,int &y)
{
int r,temp;
int x1,x2;
int y1,y2;
int mod;
if(max<min)
{
temp=max;
max=min;
min=temp;
}
if(min==0)
{
d=max;
x=1;
y=0;
return;
}
x2=1,x1=0;
y2=0,y1=1;
while(min>0)
{
mod=max/min;r=max-mod*min;max=min;min=r;
x=x2-mod*x1;x2=x1;x1=x;
y=y2-mod*y1;y2=y1;y1=y;
}
d=max,x=x2;y=y2;
}
void main()//输出的结果目标:d=gcd(a,b)与满足ax+by=d的整数x与y
{
int a,b,d,x,y;
printf("请输入两个非负整数数:");
input(a,b);
Extend_Euclid_gcd (a,b,d,x,y);
printf("输出结果:%d=gcd(%d,%d),%d*(%d)+%d*(%d)=%d/n",d,a,b,a,x,b,y,d);
}
/*测试结果:
请输入两个非负整数数:4864,3458
输出结果:38=gcd(4864,3458),4864*(32)+3458*(-45)=38
*/