我一直在嘗試在c語言中實現karatsuba算法,但不幸的是它給了我一個錯誤的結果。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),如果不是,則通過均衡它們來糾正它,並在大小爲偶數時在前面添加零。除此之外,它基本上是僞代碼算法。
低溫1和HIGH1對應一個 LOW2的低部分和高部分和高溫2對應的
低部分和高部分預先感謝您的所有響應
請學習使用調試器,這是正確的時刻。另外,請在發佈之前清理你的代碼:使用初始化器,不要強制返回'malloc',很好地格式化代碼。 –
嗨。要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後,如果有必要,你應該構建一個[最小測試用例](http://sscce.org)。) –
感謝您的回覆,我會更正這一點。 Juste注意到,我已經使用了valgrind和gdb,並且仍然沒有得到正確的結果,並且如果我嘗試30次30,我會得到009 – BigFoot