擴充套件歐幾里得演算法--C語言程式
阿新 • • 發佈:2018-12-10
前提
擴充套件歐幾里得演算法是在歐幾里得演算法(輾轉相除法)的前提下,對已知數求係數的一種演算法。擴充套件歐幾里得演算法的公式推導我就不廢話了,基本上就是第一次推導的係數等於第二次推導的係數之間的聯絡,很多文章都引用百度對擴充套件歐幾里得的定義,但是講的不是很清楚。
程式碼程式
#include<stdio.h>
int main()
{
unsigned int a,b;
int s,t,gcd;
int exgcd(unsigned int a,unsigned int b,int *x,int *y);
printf("please input two number:" );
while(scanf("%d%d",&a,&b)!=EOF)
{
gcd=exgcd(a,b,&s,&t);
printf("%d %d\n",s,t);
printf("please input two number:");
}
return 0;
}
int exgcd(unsigned int a,unsigned int b,int *x,int *y)//擴充套件歐幾里得演算法;
{
if(b==0)
{
*x=1;
*y=0;
return a;
}
printf("a:%d b:%d\n",a,b);
printf("***********************\n");
int ret=exgcd(b,a%b,x,y);
int t=*x;
*x=*y;
*y=t-a/b*(*y);
return ret;
}
注意
程式程式碼中為什麼要用unsigned int
這種資料型別,而不直接用int
型別呢?
因為程式中我輸入是3180807001,這是一個10位數的數字,int型別的長度是[-2147483648, 2147483647],已經超出了範圍長度了,會造成溢位,最後得出的結果也不對。而unsigned int
雖然出現的-1114160295這個鬼東西,可能因為不能表達還是什麼原因,不管了,反正最後的結果是對的。因為3180807001和210是互質。