[英]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.