C++ 由递归函数中的信号SIGSEGV(地址边界错误)终止
我正在尝试实现Karatsuba乘法算法。我有点遵循这个维基中的伪代码。但我总是犯这样的错误: 由信号SIGSEGV终止(地址边界错误) 当我将导致递归发生的行替换为其他行时:C++ 由递归函数中的信号SIGSEGV(地址边界错误)终止,c++,recursion,segmentation-fault,karatsuba,C++,Recursion,Segmentation Fault,Karatsuba,我正在尝试实现Karatsuba乘法算法。我有点遵循这个维基中的伪代码。但我总是犯这样的错误: 由信号SIGSEGV终止(地址边界错误) 当我将导致递归发生的行替换为其他行时: z0 = multiply(a, c); z1 = multiply(b, d); z2 = multiply(a+b, c+d); 错误消失了 这是我的密码: #include <iostream> #include <math.h> long int multiply(int x, int
z0 = multiply(a, c);
z1 = multiply(b, d);
z2 = multiply(a+b, c+d);
错误消失了
这是我的密码:
#include <iostream>
#include <math.h>
long int multiply(int x, int y);
int get_length(int val);
int main()
{
int x = 0, y = 0;
long int result = 0;
std::cout << "Enter x: ";
std::cin >> x;
std::cout << "Enter y: ";
std::cin >> y;
result = multiply(x, y);
std::cout << "Result: " << result << std::endl;
return 0;
}
long int multiply(int x, int y)
{
if(x < 10 || y < 10) {
return x * y;
}
int x_len = get_length(x);
int y_len = get_length(y);
long int z0 = 0 , z1 = 0, z2 = 0;
int a = 0, b = 0, c = 0, d = 0;
a = x / pow(10, x_len);
b = x - (a * pow(10, x_len));
c = y / pow(10, y_len);
d = y - (c * pow(10, y_len));
z0 = multiply(a, c);
z1 = multiply(b, d);
z2 = multiply(a+b, c+d);
return (pow(10, x_len) * z0) + (pow(10, x_len/2) * (z2 - z1 - z0)) + z1;
}
int get_length(int val)
{
int count = 0;
while(val > 0) {
count++;
val /= 10;
}
return count;
}
#包括
#包括
长整数乘法(整数x,整数y);
int get_长度(int val);
int main()
{
int x=0,y=0;
长整数结果=0;
std::cout>x;
std::cout>y;
结果=乘(x,y);
std::cout您正在使用pow
函数进行整数幂运算。它不是整数函数。请编写适合您的应用程序的pow
函数。例如:
int pow(int v, int q)
{
int ret = 1;
while (q > 1)
{
ret*=v;
q--;
}
return ret;
}
确保在顶部放置一个intpow(int,int);
。我找到了问题的原因。
这是因为这些台词:
a = x / pow(10, x_len);
b = x - (a * pow(10, x_len));
c = y / pow(10, y_len);
d = y - (c * pow(10, y_len));
它应该是x_len/2
而不是x_len
,与y_len
相同。因为它会导致递归无限。您为x
和y
输入了哪些值?而且,看起来您不理解pow
函数。它不是整数函数。@DavidSchwartzger大于9会导致错误。在没有阅读代码的情况下,我仍然会冒险猜测:无限递归,导致堆栈溢出。@JesperJuhl Yes!!正如你所说,我得到了它,它是一个无限递归。因为行a=x/pow(10,xlen);
和其他类似的行。它应该是a=x/pow(10,xlen/2);
你的意思是因为它返回double
而不是int
?@RafaelAdel它不是一个整数幂函数,你需要一个整数幂函数。它不仅是它的返回值,也是它的参数和逻辑。@Rafael——请阅读为什么你不应该使用pow
进行整数运算。好的,谢谢@PaulMcKenzie大卫·施瓦茨