我试图实现n * (n + 1)/2
知道n
为int
< = 2^16 - 1(这保证n * (n + 1)/2 <= 2^31 - 1
所以有没有溢出)。我们知道n * (n + 1)/2
保证是非负整数。当在程序中计算这个值时,如果我们先乘以n *(n + 1)
,我们可能会遇到整数溢出问题。我的想法是使用笨拙的条件:任何简明的方式来计算出n *(N + 1)/ 2和处理溢出同时
int m;
if (n % 2 == 0) {
m = (n/2) * (n + 1);
} else {
m = n * ((n + 1)/2);
}
有没有更简洁的方式来做到这一点?
'长TMP = N *(N + 1); m = tmp/2; '? –
@MichelBillaud'long'在某些系统上可能仍然是32位(例如Microsoft Visual C++编译器,即使在64位系统上)。 –
那么,@某些程序员伙计,'long long tmp',https://msdn.microsoft.com/en-us/en-en/library/s3f49ktz.aspx –