동시에 n 개의 * (N + 1)/2 및 취급 오버 플로우를 계산하기 위해 모든 간결한 방법은 int
는 < = 2^16-1 (이것은 그 n * (n + 1)/2 <= 2^31 - 1
그래서이 보장 오버플로가 없음).내가 <code>n</code>는 것을 알고 <code>n * (n + 1)/2</code>을 구현하기 위해 노력하고
그러면 n * (n + 1)/2
은 음수가 아닌 정수가됩니다. 프로그램에서이 값을 계산할 때, 우선 n *(n + 1)
곱셈을하면 정수 오버플로 문제가 발생할 수 있습니다. 내 생각은 서투른 조건을 사용하는 것입니다.
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 비트 일 수 있습니다 (예 : 64 비트 시스템에서도 Microsoft Visual C++ 컴파일러). –
글쎄, 어떤 프로그래머 야,'long long tmp', https://msdn.microsoft.com/en-us/en-en/library/s3f49ktz.aspx –