繁体   English   中英

大数除法

[英]Division of very large numbers

我用C ++编写了以下代码:

#include <cmath>
#include <iostream>

using namespace std;

int main()
{
    double sum, containers, n ,c, max_cap, temp;

    unsigned int j = 1;
       cin >> n >> c;
       sum = containers = n;


       for (unsigned int i = 2 ; i <= c; ++i)
       {
           max_cap = i * n;

           if (max_cap - sum > 0)
           {
              temp = ceil((max_cap - sum)/i);
              containers += temp;
              sum += i * temp;
           }
       }

       cout << containers << '\n';
}

当输入此代码的输入为“ 728 1287644555”时,大约需要5秒钟来计算答案,但是当输入大约为三倍时,即“ 763 3560664427”,则给出的时间就不会很长。(我等待了大约半小时)可以看出,算法是线性顺序的。 因此,大约需要15秒。 为什么会这样呢? 是因为在第二种情况下输入太大吗? 如果是,那么对时间的影响如此之大?

我的猜测是无符号整数溢出。

       for (unsigned int i = 2 ; i <= c; ++i)

i增加直到> c ,但是c是双精度数,而i是无符号整数。 它达到最大值( UINT_MAX )并在达到c值之前包装为0。

即1287644555小于UINT_MAX ,因此完成。 但是3560664427大于UINT_MAX ,因此它将永远循环。 这仅引发了一个问题:您在哪种奇怪的体系结构上运行:)

在我自己的机器上( UINT_MAX = 4294967295),第一个输入需要16秒的处理时间,而第二个输入需要43.5秒的处理时间,这几乎是您期望的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM