我对编程很陌生,而且我遇到了这个简单的'问题是计算算术级数的总和:
我知道公式如下:(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
?以下操作也是如此?
非常感谢阅读。
答案 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
,因此d
为long long
,而n/2
将会很长。 2*a
也需要转换为long long
。换句话说,表达式中的所有内容都计算为64位数字(或者在某些计算机中可能更大 - 而不是我曾见过的long long
更大的数字。
64位整数可以轻松保存远大于10000*100000
的数字(每侧需要另外4-5位数字以溢出64位数字),但该范围内的数字可以导致32位数学溢出,因为它大于~2000000000。