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