好吧,我得到了一个任务来构建一个可扩展的数据类型以在斐波那契生成器中使用,当我去测试它到序列中的第 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;
}
我忘了强制显示导致问题的前导零。已找到解决方案。