【问题标题】:Function returns 0 in karatsuba multiplication函数在 karatsuba 乘法中返回 0
【发布时间】:2016-10-23 17:48:28
【问题描述】:

我正在尝试通过递归调用来实现 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;
  }
 } 

【问题讨论】:

  • #define 真的,真的没必要。
  • 你试过使用调试器吗?
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 您是否愿意(启发性/有见地)评论该代码?
  • 谢谢大家。我会记住这一点

标签: c++ algorithm oop karatsuba


【解决方案1】:

在这个循环之后:

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

p 的值为零。您的递归停止在

if(n<2)
{
  return p*q;
}

因此,无论输入是什么,结果都是零。

【讨论】:

  • @AishwaryaBhave 顺便说一句,你甚至不需要调试器,一个简单的cout 就足以发现问题。
【解决方案2】:

您可能想使用p 的副本在while 循环中计算n。这样你就可以保留 p 的值。像这样的:

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

【讨论】:

    猜你喜欢
    • 2015-09-29
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多