【发布时间】:2021-07-14 01:45:09
【问题描述】:
我了解了 Karatsuba 算法,它允许我使用分治法将非常大的数字相乘。
这是我的代码。我编写了一个返回数字长度的函数,然后编写了乘法函数,并使用该方法进行了 4 次递归调用。
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int numberLength(long long value) {
int counter = 0;
while (value != 0)
{
counter++;
value /= 10;
}
return counter;
}
long long multiply(long x, long y) {
int xLength = numberLength(x);
int yLength = numberLength(y);
int n = max(xLength, yLength);
if (n < 10) {
return x*y;
}
long multiplier = pow(10, n/2);
long xS = x/multiplier;
long xD = x - (xS * multiplier);
long yS = y/multiplier;
long yD = y - (yS * multiplier);
return multiply(xS,yS*pow(10,n)) + multiply(xS,yD*pow(10,n/2)) + multiply(xD,yS*pow(10,n/2)) + multiply(xD,yD);
}
问题是,如果我用一些长度大于 10 的数字调用函数 multiply(),那么我会得到错误 Segmentation fault。问题出在哪里?
【问题讨论】:
-
看起来这里没有崩溃:godbolt.org/z/YT3qr61T7。您正在使用任何特定的编译器选项/测试设置吗?
-
pow(10, n/2)是浮点数,这意味着如果你想要精确的整数,你只能得到2^53或2^24结果值的上限....同样使用 bigint pow 进行 bigint 乘法简直是一个坏事想法....
标签: c++ algorithm divide-and-conquer karatsuba