给出不精确答案的递归Karatsuba算法
Recursive Karatsuba Algorithm giving Imprecise Answers
我一直试图在C++中为两个相同长度的大数字实现Karatsuba乘法算法。我的代码对较小的数字(如3456*1492)表现正常,但对较大的数字(例如64位数字)则失败。它通常会得到正确的前几个数字,但之后会出错。我正在使用Boost多精度库来处理大整数。
我的代码如下:
cpp_int karatsuba(cpp_int n1, cpp_int n2) {
if (n1 < 10 || n2 < 10) {
return n1 * n2;
}
int len = countDigits(n1);
cpp_int a = n1 / cpp_int(pow(10, len/2));
cpp_int b = n1 % cpp_int(pow(10, len/2));
cpp_int c = n2 / cpp_int(pow(10, len/2));
cpp_int d = n2 % cpp_int(pow(10, len/2));
cpp_int sub1 = karatsuba(a, c);
cpp_int sub2 = karatsuba(b, d);
cpp_int sub3 = karatsuba(a+b, c+d) - sub1 - sub2;
return sub1 * cpp_int(pow(10, len)) + sub3 * cpp_int(pow(10, len/2)) + sub2;
}
我已经将我的代码与几个在线实现进行了比较,但我没有发现任何会影响答案的显著差异。cpp_int
类型的精度是否存在问题,或者我的代码中是否存在问题?
非常感谢你的帮助!
我怀疑一个问题是pow返回了一个浮点表示,该表示被错误地转换为cpp_int。
使用pow的多精度版本可能会有所帮助。
此外,len/2向下取整,因此当计算pow(10,len)时,它应该是pow(0,(len/2)*2)。
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 给出不精确答案的递归Karatsuba算法