我一直在尝试用c语言实现karatsuba算法,但不幸的是它给了我一个错误的结果。
这是我的c函数:
Real* multiplication(const Real* a, const Real* b){
Real* ret;
............
z0=multiplication(low1, low2);
assert(z0!=NULL);
z2=multiplication(high1, high2);
assert(z2!=NULL);
z1=subtract(subtract( multiplication(add(low1, high1), add(low2, high2)), z2), z0);
assert(z1!=NULL);
assert((tmpA->taille == tmpB->taille) && (tmpA->taille%2==0));
ret=add(add( powerTen(z2, tmpA->size), powerTen(z1, tmpA->size/2)), z0);
assert(ret!=NULL);
.......
return ret;
}
我创建了结构:
struct Real{
int* nb;
int size;
int neg; //1=negative 0=positiv
}
所以,简而言之,我已经使用了wikipedia中的伪代码实现,并且函数开始查看两个数字的大小(如果有< 2),如果不是它通过均衡来纠正它,如果大小是偶数则在前面加零。除此之外,它基本上是伪码算法。
low1和high1对应于a的低部分和高部分 low2和high2对应于
的低部分和高部分提前感谢您的所有回复
答案 0 :(得分:0)
以下是您如何调试的概述。
完成每一步后,写下您对计算机的预期答案 然后让计算机向您显示实际得到的答案。
寻找你所期望的与实际不同的步骤。
Real* multiplication(const Real* a, const Real* b){
Real* ret;
[...]
z0=multiplication(low1, low2);
assert(z0!=NULL);
printf("Step #1: I expected 5, but I actually got %d\n", z0);
z2=multiplication(high1, high2);
printf("Step #2: I expected 7, but I actually got %d\n", z2);
assert(z2!=NULL);
z1=subtract(subtract( multiplication(add(low1, high1), add(low2, high2)), z2), z0);
printf("Step #3: I expected 3, but I actually got %d\n", z1);
assert(z1!=NULL);
assert((tmpA->taille == tmpB->taille) && (tmpA->taille%2==0));
ret=add(add( powerTen(z2, tmpA->size), powerTen(z1, tmpA->size/2)), z0);
printf("Step #4: I expected 30, but I actually got %d\n", ret);
assert(ret!=NULL);
[...]
return ret;
}
注意:你必须调整printf语句,因为我不确定期望什么值,
也不知道如何打印变量z0
,z1
和z2
,因为你没有在问题中提供足够的细节。