二元一次不定方程

Code:
  1. /******************  
  2. 二元一次不定方程求解  
  3. 給定a,b,c求ax+by=c的整數解。   
  4. 解:  
  5. 用到的定理   
  6. 1、gcd(a,b)=gcd(b,a mod b)   
  7. 2、若d|a且d|b,則d|ax+by(gcd(a,b)|ax+by)   
  8. ******************/  
  9. #include <stdio.h>   
  10. // 求得ax+by=gcd(a,b) 的x,y值    
  11. int Gcd(int a, int b, int* x, int* y)   
  12. {   
  13.     int gcd;   
  14.     int temp;   
  15.   // b=0,ax=gcd(a,0)=a   
  16.   if (b==0)   
  17.   {   
  18.     *x= 1;   
  19.     *y = 0;   
  20.     return a;   
  21.   }   
  22.   gcd = Gcd(b,a%b,x,y);   
  23.   /*****************************  
  24.  gcd(b,amodb) = gcd(b,a-[a/b]*b)  
  25.  b*x'+(amodb)*y'=gcd(a,b)  
  26.  =b*x'+(a-[a/b*b])*y'  
  27.  =a*y'+b*(x'-[a/b]*y')  
  28.  令x=y',y=x'-[a/b]y';   
  29.   ******************************/    
  30.   temp = *x;   
  31.   *x = *y;   
  32.   *y = temp - a/b*(*y);   
  33.   return gcd;    
  34. }   
  35. // 判斷是否有解並且求 ax+by=c特解    
  36. // 對於ax+by=gcd(a,b),ax+by=c.   
  37. // 如果gcd(a,b)|c,ax+by=c有很多解。   
  38. // 否則就無解    
  39. bool Judgment(int a,int b,int c, int* x, int *y)   
  40. {   
  41.   int gcd=Gcd(a,b,x,y);    
  42.   if (0 != c%gcd)   
  43.   {   
  44.     return false;   
  45.   }   
  46.   // 這個是特解    
  47.   *x=(*x)*c/gcd;   
  48.   *y=(*y)*c/gcd;   
  49.   // 所有解爲無數個    
  50.   /*******  
  51.   1.x=x0-bt  
  52.   2.y=y0+at  
  53.   1式乘以a加上2式乘以b有  
  54.   ax+by=ax0+by0=c   
  55.   ******/    
  56. }   
  57.   
  58. int main(void)   
  59. {   
  60.     int a;   
  61.     int b;   
  62.     int c;   
  63.     int x;   
  64.     int y;   
  65.     scanf("%d%d%d", &a,&b,&c);   
  66.     if (Judgment(a,b,c,&x,&y))   
  67.     {   
  68.         printf("%d  %d", x,y) ;   
  69.     }   
  70.     return 0;   
  71. }   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章