我在我的代码中发现此错误的问题,我认为在算法中使用数组作为返回数据类型。我使用数组是因为c ++没有像伪代码那样返回2个变量。 该算法接受输入2整数x和y,并且out输出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)
c ++代码:
int divisione(int x, int y)
{
int a[1];
if(x == 0)
{
a[0] = 0;
a[1] = 0;
return *a;
}
int b[1];
*b = divisione(x/2,y);
a[0] = b[0]*2;
a[1] = b[1]*2;
if((x%2) != 0)
a[1] = a[1]+1;
if(a[1]>= y)
{
a[0]+=1;
a[1]-=y;
}
return *a;
}
答案 0 :(得分:1)
您的代码存在两个大问题:
您的数组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;
}
答案 1 :(得分:0)
与返回的2个args一样,尝试将这些变量传递给除by Reference。
我建议编写一个带有更像
的签名的函数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;
}
然后你可以返回一个项目,但我仍然建议通过参考解决方案。