我试图通过递归调用实现Karatsuba乘法。下面的代码应该可以工作,但我一直得到零作为答案。有什么想法吗?
#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;
}
}
答案 0 :(得分:1)
此循环后:
while(p)
{
p=p/10;
n++;
}
p
的值为零。您的递归在
if(n<2)
{
return p*q;
}
因此,无论输入是什么,结果都会得到零。
答案 1 :(得分:0)
您可能希望使用p
的副本来计算n
循环中的while
。这样你就可以保留p的值。像这样:
ll pd = p;
while(pd)
{
pd=pd/10;
n++;
}