欧几里得算法的拓展主要是用于求解 :
已知整数 a, b,然后我们进行 ax + by == gcd(a , b) 的问题求解
那么如何进行求解呢?和欧几里得算法一样, 我们需要进行递归的方式进行问题的求解, 而且涉及到 a % b 与 a / b 和 a 的关系
我们假设已经是求出了
b x' + ( a % b ) y' == gcd(a, b);
利用关系, 我们就可以进一步回溯
a y' + b (x' - a / b * y') == gcd(a, b);
但是注意, 这里面的 x, y 对应的 x' y' 似乎是颠倒了, 但是没大问题, 我们只需要在调用函数的时候进行 x, y 参数位置的颠倒就可以
附加挑战书上面双六的代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <cctype> 6 #include <algorithm> 7 #include <string> 8 #include <vector> 9 #include <queue> 10 #include <list> 11 #include <map> 12 #include <stack> 13 #include <set> 14 #include <cstdlib> 15 using namespace std; 16 17 //这个是x , y == gcd(x, y) 的小算法哦!!! 18 int extgcd(int a, int b, int &x, int &y){ 19 int d = a; 20 if(b != 0){ 21 d = extgcd(b, a % b, y, x); 22 y -= a / b * x; 23 return d; 24 } 25 else{ 26 x = 1, y = 0; 27 return d; 28 } 29 } 30 // gcd 求解最大公因数 31 int gcd(int a, int b){ 32 return b == 0 ? a : gcd(b, a % b); 33 } 34 35 /*这个是挑战书上面双六游戏的代码*/ 36 int main() 37 { 38 int a, b; cin>>a>>b; 39 int x, y; 40 printf("GCD : %d\n", gcd(a, b)); 41 printf("EXTGCD : %d\n", extgcd(a, b, x, y)); 42 if(extgcd(a, b, x, y) == 1){ 43 printf("FIRST IF : \n"); 44 int res = (a > 0 ? a : -a) + (b > 0 ? b : -b); 45 printf("%d\n", res); 46 } 47 else{ 48 printf("SECOND ELSE : \n"); 49 printf("-1\n"); 50 } 51 return 0; 52 }
注意事项 :
函数调用的时候, 他有着位置的交换(x, y)
然后 y 的数值有着更新
甚至他后两个函数的参数是 引用, 直接对输入变量的元存储进行了修改, 也是避免了返回数值两个 x, 和 y 的麻烦;
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cctype>#include <algorithm>#include <string>#include <vector>#include <queue>#include <list>#include <map>#include <stack>#include <set>#include <cstdlib>using namespace std;
//这个是x , y == gcd(x, y) 的小算法哦!!!int extgcd(int a, int b, int &x, int &y){ int d = a; if(b != 0){ d = extgcd(b, a % b, y, x); y -= a / b * x; return d; } else{ x = 1, y = 0; return d; }}// gcd 求解最大公因数int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}
/*这个是挑战书上面双六游戏的代码*/int main(){ int a, b; cin>>a>>b; int x, y; printf("GCD : %d\n", gcd(a, b)); printf("EXTGCD : %d\n", extgcd(a, b, x, y)); if(extgcd(a, b, x, y) == 1){ printf("FIRST IF : \n"); int res = (a > 0 ? a : -a) + (b > 0 ? b : -b); printf("%d\n", res); } else{ printf("SECOND ELSE : \n"); printf("-1\n"); } return 0;}