1. 程式人生 > >擴充套件歐幾里得演算法--C語言程式

擴充套件歐幾里得演算法--C語言程式

前提

擴充套件歐幾里得演算法是在歐幾里得演算法(輾轉相除法)的前提下,對已知數求係數的一種演算法。擴充套件歐幾里得演算法的公式推導我就不廢話了,基本上就是第一次推導的係數等於第二次推導的係數之間的聯絡,很多文章都引用百度對擴充套件歐幾里得的定義,但是講的不是很清楚。

程式碼程式

#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

的範圍是[0,4394967295]在範圍長度之內。

雖然出現的-1114160295這個鬼東西,可能因為不能表達還是什麼原因,不管了,反正最後的結果是對的。因為3180807001和210是互質。