划分非常大的数字
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
是一个无符号的int。它达到最大值(UINT_MAX
)并在达到c
值之前换行为0。
即1287644555小于UINT_MAX
,所以它就完成了。但是3560664427大于UINT_MAX
,所以它永远循环。这只会提出一个问题,即您在什么奇怪的架构上运行它:)
在我自己的机器上(UINT_MAX
= 4294967295),第一个输入需要 16 秒来处理,而第二个输入需要 43.5 秒,几乎是你所期望的。
相关文章:
- 使用浮点数和双精度数的非常小数字的数学
- 如何非常快速地将数字添加到 Vector 中的一系列元素中
- 具有非常非常大数字的算术运算
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 如何找到由公式计算的非常大的数字的最后一位数字?
- 找到非常大的数字的最右边的未设置位
- 在C++中使用限制和非常大的数字时出现问题
- C 非常奇怪的数字
- 在不使用递归的情况下将 FFT 应用于两个非常大的数字的乘法
- C++整数除法给出非常大的数字
- 在不进行线性搜索的情况下,在非常大的数组中找到比给定数字更小的数字
- 两个非常大的数字的乘积的第一个数字
- 找到非常大数字的分裂模型
- 在非常大的数字序列中查找句点
- 如何在 c++ 中存储非常大的数字
- 查找非常大的 2^n 数字的最后一位数字
- 将十进制转换为二进制,并计算其中的数字非常非常大
- 在GTest中,如何检查数字非常接近0?EXPECT_FLOAT_EQ不工作
- 输出文件中显示的数字非常大
- 数字的组成,其中数字非常大