分数非常大

时间:2015-06-13 11:07:32

标签: c++ time-complexity computation

我在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秒钟,但当输入大约是3次时,即“763 3560664427”时,它不会给很长时间。(我等了一下半小时)可以看出算法是线性的。因此,大约需要15秒。为什么会这样?是因为第二种情况下输入太大了吗?如果是,那么它如何影响时间呢?

1 个答案:

答案 0 :(得分:1)

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

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

i增加,直到&gt; c,但c是双精度,而i是无符号整数。它达到最大值(UINT_MAX)并在达到c的值之前回到0。

即。 1287644555小于UINT_MAX,因此完成。但是3560664427大于UINT_MAX,所以它永远循环。这只会引发你在运行这个奇怪架构的问题:)

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