GCD欧几里得的拓展算法

  欧几里得算法的拓展主要是用于求解   :

    已知整数 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;}











posted @ 2019-09-09 15:19  lucky_light  阅读(188)  评论(0编辑  收藏  举报