使用链接列表计算巨号

时间:2013-06-18 04:08:16

标签: c++ linked-list fibonacci

好吧,我得到了一个用于构建可在Fibonacci生成器中使用的可伸缩数据类型的赋值,当我将它测试到序列中的第1000个数字时,我的任务就完成了。

我注意到它没有对齐并且确定问题在序列中的第262个数字处。经过一些调试后,我发现这是链表从7个整数移动到8个整数的地方,但我不知道它与问题有关。

我要找的号码是:

2 542 592 393 026 885 507 715 496 646 813 780 220 945 054 040 571 721 231

我得到的数字是:

1 154 259 239 326 885 507 715 496 646 813 780 220 945 054 040 571 721 231

正如您可能注意到的那样,它们非常相似,直到最后一个块(左端)。

我的来源有点长,所以我做了一个要点:

https://gist.github.com/anonymous/5802620

携带超过1,000,000,000的任何东西的魔力发生在第378行的功能中: https://gist.github.com/anonymous/5802620#file-main-cpp-L378

作为更新,我仍然会'接近,但没有雪茄'输出。以下是可能是罪魁祸首的代码(包括提供的答案):

Giant Giant::operator + (const Giant & rightSide)
{
   Giant returned;
   int extra = 0;

   for(int i = 0;
      i < chunks.getNumItems() && i < rightSide.chunks.getNumItems(); i++)
   {
      int num = chunks.getData(i) + rightSide.chunks.getData(i);
      returned.chunks.insert((num + extra) % chunkSize,
         returned.chunks.getNumItems());
      extra = (num + extra) / chunkSize;
   }

   if(chunks.getNumItems() > rightSide.chunks.getNumItems())
   {
      for(int i = rightSide.chunks.getNumItems();
          i < chunks.getNumItems(); ++i)
      {
         returned.chunks.insert(extra + chunks.getData(i),
            returned.chunks.getNumItems());
         extra = 0;
      }
   }
   else if(chunks.getNumItems() < rightSide.chunks.getNumItems())
   {
      for(int i = chunks.getNumItems();
          i < rightSide.chunks.getNumItems(); ++i)
      {
         returned.chunks.insert(extra + rightSide.chunks.getData(i),
            returned.chunks.getNumItems());
         extra = 0;
      }
   }

   if (extra != 0)
   {
       returned.chunks.insert(extra, returned.chunks.getNumItems());
   }

   return returned;
}

更新 班上的一名成员走了过来,我们查看了代码。问题出在这里:

ostream & operator << (ostream & out, const Giant & giant)
{
   for(int i = giant.chunks.getNumItems() - 1;
      i >= 0; i -= 1)
   {
      if (i != giant.chunks.getNumItems()-1)
         out << setw(9) << setfill('0');
      out << giant.chunks.getData(i);
   }
   return out;
}

我忘了强制显示导致问题的前导零。找到了解决方案。

3 个答案:

答案 0 :(得分:2)

您的问题似乎在第387行和第389行。您不会在等式中尽快计算extra。这些行应分别有((num + extra) % chunkSize)extra = (num + extra )/ chunkSize;。根据您当前的实现,其中一个段可能是1000000000而没有进位而不是带有进位的0(如果我正在阅读您的意图,如果您想要的话)。

答案 1 :(得分:1)

除了其他人所说的内容之外,我认为你需要在第399行和第408行开始的循环中考虑extra。特别是,如果额外非零,你可以选择其中一个两个循环,你需要将额外的金额添加到你在该循环中插入的第一个东西(而不是在第394行单独添加它)。

根据您的评论编辑。这基本上就是我对第392-414行的意思:

if(chunks.getNumItems() > rightSide.chunks.getNumItems())
{
   for(int i = rightSide.chunks.getNumItems();
       i < chunks.getNumItems(); ++i)
   {
      returned.chunks.insert(extra + chunks.getData(i),
         returned.chunks.getNumItems());
      extra = 0;
   }
}
else if(chunks.getNumItems() < rightSide.chunks.getNumItems())
{
   for(int i = chunks.getNumItems();
       i < rightSide.chunks.getNumItems(); ++i)
   {
      returned.chunks.insert(extra + rightSide.chunks.getData(i),
         returned.chunks.getNumItems());
      extra = 0;
   }
}
else if (extra != 0)
{
    returned.chunks.insert(extra, returned.chunks.getNumItems());
}

当然,如果可行的话,也有办法“简化它”。

答案 2 :(得分:0)

<强>更新 班上的一名成员走了过来,我们查看了代码。问题出在这里:

ostream & operator << (ostream & out, const Giant & giant)
{
   for(int i = giant.chunks.getNumItems() - 1;
      i >= 0; i -= 1)
   {
      if (i != giant.chunks.getNumItems()-1)
         out << setw(9) << setfill('0');
      out << giant.chunks.getData(i);
   }
   return out;
}

我忘了强制显示导致问题的前导零。找到了解决方案。