C++ 试图从c++;(除法递归算法)

C++ 试图从c++;(除法递归算法),c++,algorithm,pseudocode,C++,Algorithm,Pseudocode,我在代码中发现这个bug时遇到了问题,我认为这是因为在算法中使用数组作为返回数据类型。我使用数组是因为C++没有返回2个变量,就像它在伪代码上一样。 该算法输入2个整数x和y,输入输出给出2个整数q,r(我使用2个元素的数组a[])以及商和提醒 伪代码: divide(x,y) if x = 0: return (q,r) <-- (0,0) (q,r) <-- divide(x/2,y) q = 2*q, r= 2*r if x is odd: r=

我在代码中发现这个bug时遇到了问题,我认为这是因为在算法中使用数组作为返回数据类型。我使用数组是因为C++没有返回2个变量,就像它在伪代码上一样。 该算法输入2个整数x和y,输入输出给出2个整数q,r(我使用2个元素的数组a[])以及商和提醒

伪代码:

divide(x,y)
    if x = 0: return (q,r) <-- (0,0)
    (q,r) <-- divide(x/2,y)
    q = 2*q, r= 2*r
    if x is odd: r= r+1
    if r>=y: r=r-y, q = q+1
    return(q,r)

您的代码有两个大问题:

  • 数组
    a
    的大小声明为1,而不是2,因此当您访问
    a[1]
    时,您访问的是一个不存在的元素,这是未定义的行为

  • 您只返回数组的第一个元素。这就是
    *a
    的意思

  • 不要使用数组,只需定义与伪代码匹配的结构即可

    typedef struct {
        int q;
        int r;
    } DivisionResult;
    
    DivisionResult division(int x, int y) {
        DivisionResult result;
        if (x == 0) {
            result.q = result.r = 0;
            return result;
        }
    
        result = division(x/2, y);
        result.q = result.q * 2;
        result.r = result.r * 2;
        if (x % 2 != 0) {
            result.r = result.r + 1;
        }
        if (result.r >= y) {
            result.q = result.q + 1;
            result.r = result.r - y;
        }
        return result;
    }
    

    与返回2个参数一样,尝试将这些变量传递到divide中

    我建议编写一个带有签名的函数,更像

    void divide(double num1, double num2, double &quotient, double &remainder)
    {
        //check args
        remainder = num1 % num2;
        quotient = num1 / num2;
        //the above variables get returned since they were passed **by reference**
    }
    
    您还可以创建一个小数据结构来处理结果,如下所示:

    struct DivideResult
    {
        //these variables are public by default so you can do '*structname*.function'
        double quotient;
        double remainder;
    }
    

    然后你可以只返回一个项目,但我仍然建议使用按参考的解决方案。

    这个问题似乎离题了,因为它是关于请求其他人做OP的工作。Q:你认为有多少元素
    int a[1]有?EHR,我只是试图从伪代码转换成C++代码,这是我的算法和数据结构书上的一个基本功能,这不是我要为获得额外的信用而付出的代价。@保罗2,对吗?这应该是我的商(q)和我的提醒(r)@blackdev1l 2,对吗?不这是一个明显错误的假设,
    inta[1]当然只包含一个元素。在C++中,代码在<代码> 0代码>开始,因此访问<代码> A[ 1 ] < /代码>超出范围!1) 我的天啊,我真傻。2) 是的,我知道,它应该返回第一个元素(q)的指针,因此它位于q和r(a[0]和a[1])的位置。您不能“返回它所在的指针”。当函数返回时,该指针无效,因为它指向堆栈上的数组,并且当函数返回时堆栈变量不再存在。是的,我认为这是从这个伪代码到C++代码的最好方法,基本上当我再次发现一个2返回的算法时,最好的方法是使用一个类/Stutt。无论如何,我非常感谢你。我确信写一个简单的diff[f]函数是最有效的方法,我想学习从我书中发现的伪代码传递到C++代码。对于这种解决方案,它是一种做同样事情的不同算法:)
    
    struct DivideResult
    {
        //these variables are public by default so you can do '*structname*.function'
        double quotient;
        double remainder;
    }