2016-10-23 17 views
-1

私は再帰呼び出しによってKaratsuba乗算を実装しようとしています。下のコードはうまくいくはずですが、私は答えとしてゼロを取得し続けます。何かご意見は?関数はカラツバ乗算で0を返します

#define ll long long int 
ll kmul(ll p, ll q) 
{ 
    ll a,b,c,d,ans; 
    ll n=0; 
    while(p) 
    { 
     p=p/10; 
     n++; 
    } 
    //cout<<n<<endl; 
    if(n<2) 
    { 
     return p*q; 
    } 
    else 
    { 
    int k=n/2; 
    ll j=pow(10,k); 
    a=p/j; 
    b=p%j; 
    c=q/(j); 
    b=q%j; 
    ans=(pow(10,n)*(kmul(a,c)))+(j*kmul(a,d)*kmul(b,c))+kmul(b,d); 
    return ans; 
    } 
} 
+2

'#define'は本当に、本当に必要ありません。 –

+0

デバッガを試しましたか? – UnholySheep

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

1

このループ後:

while(p) 
{ 
    p=p/10; 
    n++; 
} 

pの値がゼロです。あなたの再帰は、

で終了します。
if(n<2) 
{ 
    return p*q; 
} 

したがって、入力が何であれ、結果としてゼロが得られます。

+0

よろしくお願いします。 –

+0

@Aishwarya私はデバッガを必要としないので、単純な 'cout'で問題を発見するのに十分でした。 – user463035818

0

ループのnの計算にpのコピーを使用したい場合があります。そうすれば、pの価値を維持することができます。このようなもの:

ll pd = p; 
while(pd) 
{ 
    pd=pd/10; 
    n++; 
} 
関連する問題