2013-08-29 99 views
-2

我一直在嘗試在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對應的

低部分和高部分預先感謝您的所有響應

+3

請學習使用調試器,這是正確的時刻。另外,請在發佈之前清理你的代碼:使用初始化器,不要強制返回'malloc',很好地格式化代碼。 –

+7

嗨。要求人們發現代碼中的錯誤並不是特別有效。您應該使用調試器(或者添加打印語句)來分析問題,追蹤程序的進度,並將其與預期發生的情況進行比較。只要兩者發生分歧,那麼你就發現了你的問題。 (然後,如果有必要,你應該構建一個[最小測試用例](http://sscce.org)。) –

+0

感謝您的回覆,我會更正這一點。 Juste注意到,我已經使用了valgrind和gdb,並且仍然沒有得到正確的結果,並且如果我嘗試30次30,我會得到009 – BigFoot

回答

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語句,因爲我不知道什麼值期待, 也不如何打印變量z0z1z2因爲你沒有把足夠在你的問題中的細節。

+0

非常感謝您的回答,我會盡力而爲,對於格式不正確的答案感到抱歉,但我對StackOverflow頗爲新穎。 – BigFoot

+1

好吧,這不是你如何調試 - 你通常會使用調試器。做「printf'調試」通常是新程序員採取的第一步,但通常來說,你應該使用正確的工具來完成這項工作。使用螺絲刀的背面作爲錘子來驅動釘子,但這不是最好的方法。簡而言之:*學會使用調試器*。 –

+2

@NikBougalis:我完全同意Scriptor應該學習一個調試器,但我也會得到這樣的印象,就像要求一隻猴子來飛航天飛機。相反,我只會鼓勵他現在就使用一些簡單的工具,並希望稍後再個人成長。 (畢竟,我13歲時開始用廣泛的'printfs'進行調試......最終我想出了調試器)。 – abelenky