我在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秒。为什么会这样?是因为第二种情况下输入太大了吗?如果是,那么它如何影响时间呢?
答案 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秒,这几乎是你所期望的。