如何用C ++计算大数?

时间:2014-08-20 07:43:07

标签: c++ largenumber

我对编程很陌生,而且我遇到了这个简单的'问题是计算算术级数的总和:

我知道公式如下:(2*a + (n-1)*d) * n/2

adnintn可以是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?以下操作也是如此?

非常感谢阅读。

2 个答案:

答案 0 :(得分:0)

C ++中的整数类型具有固定的位数。具体数量因计算机而异,但int始终至少 16位,long至少为32位且long long至少为64位。如果混合使用这些,结果类型是最长的类型。但是,除非您使用相应的unsigned类型,否则您将丢失一位符号。

因此,在您的示例中,您的数字范围为10 ^ 4 * 10 ^ 5 * 10 ^ 5,因此10 ^ 14。这在long long(~10 ^ 19)的范围内很好,但不在int的最小范围内。现在int通常大于最小16位,但它通常只有32位。这就解释了为什么它不适合你。

答案 1 :(得分:0)

在这个表达式中:

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将会很长。 2*a也需要转换为long long。换句话说,表达式中的所有内容都计算为64位数字(或者在某些计算机中可能更大 - 而不是我曾见过的long long更大的数字。

64位整数可以轻松保存远大于10000*100000的数字(每侧需要另外4-5位数字以溢出64位数字),但该范围内的数字可以导致32位数学溢出,因为它大于~2000000000。