C++ 大数除法
我用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 (
#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;ic
,但是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
的值以获得洞察力。此外,您绝对必须学习如何使用调试器,调试器允许您单步执行代码并检查变量。