学习:数学----gcd及扩展gcd

gcd及扩展gcd可以用来求两个数的最大公因数,扩展gcd甚至可以用来求一次不定方程ax+by=c的解

总结代码(暂时只写了代码板子,关于gcd和扩展gcd的一切晚点再写)


  1.a与b的最大公因数

  2.求ax+by=c的某一个解

  3.求ax+by=c的最小正整数解(如果不存在则求最靠近0,0的解)

 1 #include <iostream>
 2 using namespace std;
 3 /*1*/long long getGcd(long long _a,long long _b){
 4     if(_b==0)    return _a;
 5     else    return getGcd(_b,_a%_b);
 6 }
 7 /*2*/long long getExgcd(long long _a,long long _b,long long &_x,long long &_y){
 8     if(_b==0){
 9         _x=1,_y=0;
10         return _a;
11     }    
12     long long _gcd=getExgcd(_b,_a%_b,_x,_y);
13     long long _rx=_x;
14     _x=_y;
15     _y=_rx-_a/_b*_y;
16     return _gcd; 
17 }
18 /*3*/long long getAnyCalc(long long _a,long long _b,long long _c,long long &_x,long long &_y){
19     long long _gcd=getExgcd(_a,_b,_x,_y);
20     if(_c%_gcd)    return -1;
21     long long _transit=_c/_gcd;
22     _x*=_transit;_y*=_transit;
23     return _gcd;
24 }
25 /*4*/long long getUpCalc(long long _a,long long _b,long long _c,long long &_x,long long &_y){
26     long long _gcd=getExgcd(_a,_b,_x,_y);
27     if(_c%_gcd)    return -1;
28     long long _transit=_c/_gcd;
29     _x*=_transit;_y*=_transit;
30     long long __a=_a,__b=_b;
31     _a/=_gcd;_b/=_gcd;
32     _x=_x%_b<0?_x%_b+(_b<0?-_b:_b):_x%_b;
33     _y=_y%_a<0?_y%_a+(_a<0?-_a:_a):_y%_a;
34     if(_c<0)    _y=(_c-__a*_x)/__b;
35     else    _x=(_c-__b*_y)/__a;
36     return _gcd;
37 }
38 int main(){
39     getGcd(long long a,long long b)//1
40     getAnyCalc(long long a,long long b,long long c,long long x,long long y)//2,3
41     getUpCalc(long long a,long long b,long long c,long long x,long long y)//2,4
42 }
求三小问的代码

使用说明:函数getGcd(long long a,long long b)求a与b的最大公约数(需要1号函数

     函数getAnyCalc(long long a,long long b,long long c,long long x,long long y)求ax+by=c的某一个解(不存在解返回-1,存在返回gcd(a,b),解x与y传的是引用)(需要2,3号函数

     函数getUpCalc(long long a,long long b,long long c,long long x,long long y)求ax+by=c的最小非负整数解(不存在解返回-1,存在解且不存在最小非负整数解则得到的解为最靠近(0,0)的解且返回的是gcd(a,b))(需要2,4号函数

猜你喜欢

转载自www.cnblogs.com/qiyueliu/p/10861338.html
gcd
今日推荐