C++ 大数除法

C++ 大数除法,c++,time-complexity,computation,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 (

我用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';
}
#包括
#包括
使用名称空间std;
int main()
{
双和,容器,n,c,最大上限,温度;
无符号整数j=1;
cin>>n>>c;
总和=容器=n;
for(无符号整数i=2;i 0)
{
温度=ceil(最大上限总和)/i;
容器+=温度;
总和+=i*temp;
}
}

cout我猜是无符号整数溢出

       for (unsigned int i = 2 ; i <= c; ++i)
for(unsigned int i=2;i
c
,但是
c
是一个双精度整数,而
i
是一个无符号整数。它达到最大值(
UINT\u MAX
),并在达到
c
的值之前包装为0

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


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

<代码>未签名的双< /C> >这绝对不是一个有效的C++源代码,不仅因为
无符号双精度
,还因为
继续
出循环。您能否提供一个有效的变量?除了已经提出的其他问题外,您的问题可能涉及有效的
无符号整数
s(根据您引用的数字,可能是32位变量)和有效的
双精度
s(64位)之间的差异。因此,
unsigned int
可能会溢出,并在循环有机会终止之前变为
0
(由于
i=UINT\u MAX
循环将无限期地继续旋转。输出循环中
i
的值以获得洞察力。此外,您绝对必须学习如何使用调试器,调试器允许您单步执行代码并检查变量。