我試圖實現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 –