划分非常大的数字

Division of very large numbers

本文关键字:数字 非常 划分      更新时间:2023-10-16

我用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是一个无符号的int。它达到最大值(UINT_MAX)并在达到c值之前换行为0。

即1287644555小于UINT_MAX,所以它就完成了。但是3560664427大于UINT_MAX,所以它永远循环。这只会提出一个问题,即您在什么奇怪的架构上运行它:)

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