【发布时间】:2015-08-29 08:13:34
【问题描述】:
我用 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 秒。为什么会这样?是因为在第二种情况下输入太大了吗?如果是,那么它对时间的影响如此之大?
【问题讨论】:
-
unsigned double? -
这绝对是不是有效的 C++ 源代码,不仅因为
unsigned double还因为continue退出了循环。你能提供一个有效的变体吗? -
除了已经提出的其他问题外,您的问题可能涉及有效
unsigned ints 的范围(根据您引用的数字可能是 32 位)和有效doubles(64位)。因此,unsigned int可能会在循环有机会终止之前溢出并变为0(由于i <= c),因为给定的c超过了i在提升为两倍之前可以表示的值。因此,如果c >= UINT_MAX循环将无限期地继续旋转。 -
输出例如
i在循环中的值以获得洞察力。此外,您绝对必须学习如何使用调试器,它允许您单步执行代码并检查变量。
标签: c++ time-complexity computation