二元一次不定方程

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. }   

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值