Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 欧几里德';s算法函数参数_C++_Algorithm_Parameters - Fatal编程技术网

C++ 欧几里德';s算法函数参数

C++ 欧几里德';s算法函数参数,c++,algorithm,parameters,C++,Algorithm,Parameters,我已经为类编写了一个程序,在这个类中,我需要递归地计算a和b的扩展欧几里德算法,返回G,最大公约数,以及as+bt=gcd(a,b)中的s和t。我很确定我已经正确地编写了函数,但是我在函数之间传递值时遇到了问题。我已经有一段时间没有编写代码了,最近才编写了伪代码,所以我有点生疏了 例如,我写了当b=0时,返回(a,1,0),但是当我输入b为0时,我得到了返回(0,0,0),并且无法理解为什么会发生这种情况。任何帮助或指导都将不胜感激 #include <iostream> using

我已经为类编写了一个程序,在这个类中,我需要递归地计算a和b的扩展欧几里德算法,返回G,最大公约数,以及as+bt=gcd(a,b)中的s和t。我很确定我已经正确地编写了函数,但是我在函数之间传递值时遇到了问题。我已经有一段时间没有编写代码了,最近才编写了伪代码,所以我有点生疏了

例如,我写了当b=0时,返回(a,1,0),但是当我输入b为0时,我得到了返回(0,0,0),并且无法理解为什么会发生这种情况。任何帮助或指导都将不胜感激

#include <iostream>
using namespace std;
int ExtGCD (int a, int b)
{
    int g, s, t, g1, s1, t1;
    if (b == 0) {
        return (a, 1, 0);
    }
    (g1, s1, t1) = ExtGCD(b, a%b);
    g = g1;
    s = s1;
    t = s1 - ((a/b)*t1);
    return (g, s, t);
}

int main(int argc, char* argv[])
{
    int a,b, g2, s2, t2, temp;
    cout << "Please input a: ";
    cin >> a;
    cout << "Please input b: ";
    cin >> b;
    if (b > a) {
        temp = a; a = b; b = temp;
    }
    (g2, s2, t2) = ExtGCD (a, b);
    cout << "G = "<< g2 << ", S = " << s2 << ", T = " << t2;
    return 0;
}
#包括
使用名称空间std;
int ExtGCD(int a,int b)
{
int g,s,t,g1,s1,t1;
如果(b==0){
返回(a,1,0);
}
(g1,s1,t1)=ExtGCD(b,a%b);
g=g1;
s=s1;
t=s1-((a/b)*t1);
回报率(g、s、t);
}
int main(int argc,char*argv[])
{
内部a、b、g2、s2、t2、温度;
cout>a;
cout>b;
如果(b>a){
温度=a;a=b;b=温度;
}
(g2,s2,t2)=ExtGCD(a,b);

cout不能像那样返回元组

在C++中,遗嘱将左侧的东西扔掉。在特定情况下,“元组”<代码>(a,b,c)< />实际上等于“代码> c>代码>。更具体的例子:

if (b == 0) {
    return (a, 1, 0);
}
实际上和

if (b == 0) {
    return 0;
}
要同时返回多个内容,必须使用结构或类

return (g, s, t);
不做您认为它做的事情。不可能从这样的函数返回多个值。如果您想了解该代码的作用,请查阅逗号运算符

有几种不同的方法可以处理这个问题。也许最简单的方法是通过传递给函数的引用返回值。如下所示

#include <iostream>
using namespace std;

void ExtGCD (int a, int b, int& g, int& s, int& t)
{
    int g1, s1, t1;
    if (b == 0) {
        g = a;
        s = 1;
        t = 0;
        return;
    }
    ExtGCD(b, a%b, g1, s1, t1);
    g = g1;
    s = s1;
    t = s1 - ((a/b)*t1);
}

int main(int argc, char* argv[])
{
    int a,b, g2, s2, t2, temp;
    cout << "Please input a: ";
    cin >> a;
    cout << "Please input b: ";
    cin >> b;
    if (b > a) {
        temp = a; a = b; b = temp;
    }
    ExtGCD (a, b, g2, s2, t2);
    cout << "G = "<< g2 << ", S = " << s2 << ", T = " << t2;
    return 0;
}
#包括
使用名称空间std;
无效ExtGCD(内部a、内部b、内部g、内部s、内部t&t)
{
intg1,s1,t1;
如果(b==0){
g=a;
s=1;
t=0;
返回;
}
ExtGCD(b,a%b,g1,s1,t1);
g=g1;
s=s1;
t=s1-((a/b)*t1);
}
int main(int argc,char*argv[])
{
内部a、b、g2、s2、t2、温度;
cout>a;
cout>b;
如果(b>a){
温度=a;a=b;b=温度;
}
ExtGCD(a,b,g2,s2,t2);

coutC++11引入了元组,它允许您这样编写代码,只需很少的修改:

#include <iostream>
#include <tuple>

using namespace std;
std::tuple<int, int, int> ExtGCD (int a, int b)
{
    int g, s, t, g1, s1, t1;
    if (b == 0) {
        return std::make_tuple(a, 1, 0);
    }
    std::tie(g1, s1, t1) = ExtGCD(b, a%b);
    g = g1;
    s = s1;
    t = s1 - ((a/b)*t1);
    return std::make_tuple(g, s, t);
}

int main(int argc, char* argv[])
{
    int a,b, g2, s2, t2, temp;
    cout << "Please input a: ";
    cin >> a;
    cout << "Please input b: ";
    cin >> b;
    if (b > a) {
        temp = a; a = b; b = temp;
    }
    std::tie(g2, s2, t2) = ExtGCD (a, b);
    cout << "G = "<< g2 << ", S = " << s2 << ", T = " << t2;
    return 0;
}

甚至

std::tie(b, a) = std::minmax({a, b});

<> P> C++标准库提供了许多算法设施,应该学习到充分利用C++的潜力。

我几乎肯定它将是与逗号运算符相关的东西,但我还不知道能给出完整的答案。<代码>返回(g,s,t)
--这是什么意思?这不是Python!打印
a
b
。如果键入“0”,那实际上是ascii码48。当你输入它们时,找出
a
b
是什么。太棒了,谢谢!我已经完全忘记了函数内部的引用和变量更改。谢谢你的提示。现在我只需要想一想这到底是怎么回事。领带部分让我困惑。
std::tie(b,a)=std::minmax(a,b)
这与您想象的非常不同。您需要的是
初始值设定项\u list
重载
std::minmax
@user2797124 std::tie创建一个对其参数的左值引用元组,这意味着从元组到该元组的赋值运算符实际上会修改作为参数传递的变量。@robson3.14已修复,但我很困惑。请详细解释差异:)请参阅
if (b > a)
    std::swap(a, b);
std::tie(b, a) = std::minmax({a, b});