-1

そのいくつかの誤算。

数が多くて困っています。このコードは、いくつかの小さなinputs( N)では機能しますが、そのような入力100000では機能しません。

result変数の正しい最終的な答えは、あるN = 100000必要があります4999949998 が、このコードの結果は704982702

long long result = 0;
int N;
cin >> N;
.
.          //some changes on result
.
result = result / 2;
long long tmp =( N*(N - 1) ) / 2;
result = tmp - result;
cout << result << endl;

しかし、tmpあまりにも長く、オーバーフローしていないようです。

しかし、いくつかの簡単な変更で正しくなりました。

long long result = 0;
int N;
cin >> N;
.
.          //some changes on result
.
result = result / 2;
long long tmp = 0;
for (int i = 1; i < N; i++)
    tmp += N;
tmp = tmp / 2;
result = tmp - result;
cout << result << endl;

理由がわかりません。知っていますか?

4

1 に答える 1

4
( N*(N - 1) ) / 2

この式では、すべてがintであるため、結果は で計算され、計算中にintオーバーフローしますN*(N - 1)

( static_cast<long long>(N)*(N - 1) ) / 2

˙toをN変換long longすると問題が解決し、予想どおり、除算と同じ結果が得られlong longます。intlong long

于 2015-08-14T08:49:27.017 に答える