c++ - euclid 的扩展算法 C++

标签 c++ algorithm

我对 Euclid 的扩展算法有疑问。 (ax+by=gcd(a,b)) 我正在尝试确定 GCD 以及 x 和 y。 GCD 不是问题,但使用循环方法时 x 和 y 出现问题。通常一个数字出现为 0,另一个是异常大的负数。代码如下:

#include <iostream>

using namespace std;

main ()
{
    int a,b,q,x,lastx,y,lasty,temp,temp1,temp2,temp3;
    cout << "Please input a" << endl;
    cin >> a; 
    cout << "Please input b" << endl;
    cin >> b;
    if (b>a) {//we switch them
        temp=a; a=b; b=temp;
    }
    //begin function
    x=0;
    y=1;
    lastx=1;
    lasty=0;
    while (b!=0) {
        q= a/b;
        temp1= a%b;
        a=b;
        b=temp1;

        temp2=x-q*x;
        x=lastx-q*x;
        lastx=temp2;

        temp3=y-q*y;
        y=lasty-q*y;
        lasty=temp3;
    }

    cout << "gcd" << a << endl;
    cout << "x=" << lastx << endl;
    cout << "y=" << lasty << endl;
    return 0;
}

最佳答案

虽然很久以前就有人问过这个问题,但答案将帮助那些正在寻找扩展欧几里得算法的 C++ 实现的人。

这是一个递归的 C++ 实现:

int xGCD(int a, int b, int &x, int &y) {
    if(b == 0) {
       x = 1;
       y = 0;
       return a;
    }

    int x1, y1, gcd = xGCD(b, a % b, x1, y1);
    x = y1;
    y = x1 - (a / b) * y1;
    return gcd;
}

代码示例:

#include <iostream>

int main()
{
   int a = 99, b = 78, x, y, gcd;

   if(a < b) std::swap(a, b);

   gcd = xGCD(a, b, x, y);
   std::cout << "GCD: " << gcd << ", x = " << x << ", y = " << y << std::endl;

   return 0;
}

输入:

a = 99, b = 78

输出:

GCD:3,x = -11,y = 14

关于c++ - euclid 的扩展算法 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826114/

相关文章:

c++ - boost::program_options 是否支持要求一系列替代方案中的一个?

c++函数模板编译错误 "‘containerType’不是模板”

algorithm - 寻找四次方程正实解的专用算法?

混洗数据的算法

algorithm - N个矩形的交集

c++ - getline() 函数将标题捆绑在一起

c++ - 是否可以创建和使用 MatIterator 数组?

java - 算法需要帮助

c++ - 使用自动递增参数调用宏

algorithm - LZ77和Direct2编码算法的实现