如何在c++中计算大数
How to calculate large numbers in C++?
我对编程很陌生,我遇到了这个计算等差数列和的"简单"问题:
我知道公式是这样的:(2*a + (n-1)*d) * n/2
a
, d
, n
为int
。n
可以在10000左右,a
和d
可以达到100000。
我知道,只要写:
int result = (2*a + (n-1)*d) * n/2;
不能工作
*编辑:所以当我写这样的东西时它是有效的:
long long result = (2*a+(long long)(n-1)*d)*n/2;
但只是为了澄清以下推理是否正确:
由于(long long)
包装器,(n-1)*d
被更改为long long
类型。
那么(2*a+(long long)(n-1)*d)
也变成了long long
?下面的操作也是这样吗?
c++中的整数类型有固定的位数。确切的数字因计算机而异,但int
总是至少 16位,long
至少32位,long long
至少64位。如果将它们混合,则结果类型是最长的类型。但是,除非您使用相应的unsigned
类型,否则您将为该符号丢失1位。
在你的例子中,你的数字范围是10^4 * 10^5 * 10^5,所以是10^14。这在long long
(~10^19)的范围内,但不在int
的最小范围内。现在int
通常大于最小的16位,但通常仍然只有32位。这就是为什么它不适合你。
在这个表达式中:
long long result = (2*a+(long long)(n-1)*d)*n/2;
(long long)(n-1)
的强制转换将n-1
的值转换为long long
(所以最小64位)。这意味着与此相关的任何数学运算也需要转换为long long
,因此d
是long long
,而n/2
将是long long。2*a
也需要转换为long long
。换句话说,表达式中的所有内容都以64位数字计算(或者在某些机器中可能更大-我从未见过具有更大long long
的机器)。
64位整数很容易容纳比10000*100000
大得多的数字(你需要在每一边再加4-5位数字来溢出64位数字),但是在这个范围内的数字可能会导致32位数学溢出,因为它大于~2000000000。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 计算缩放多边形的比例,得到给定的多边形面积
- 在C++中如何在没有pow的情况下进行基础计算
- 计算平均值,不包括上次得分
- 如何计算多映射中重复对的数量