如何在c++中计算大数

How to calculate large numbers in C++?

本文关键字:计算 c++      更新时间:2023-10-16

我对编程很陌生,我遇到了这个计算等差数列和的"简单"问题:

我知道公式是这样的:(2*a + (n-1)*d) * n/2

a, d, nintn可以在10000左右,ad可以达到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,因此dlong long,而n/2将是long long。2*a也需要转换为long long。换句话说,表达式中的所有内容都以64位数字计算(或者在某些机器中可能更大-我从未见过具有更大long long的机器)。

64位整数很容易容纳比10000*100000大得多的数字(你需要在每一边再加4-5位数字来溢出64位数字),但是在这个范围内的数字可能会导致32位数学溢出,因为它大于~2000000000。