это какой-то просчет.
У меня проблемы с большими числами.
этот код работает для некоторых небольших входов (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;
Я не могу найти причину. вы это знаете?
( N*(N - 1) ) / 2
Я это выражение, все int
следовательно, результат рассчитывается в int
и переполняется при расчете N*(N - 1)
,
( static_cast<long long>(N)*(N - 1) ) / 2
Coverting N
в long long
решает проблему, long long
искалеченный int
дает long long
Результат, как и ожидалось, такой же для деления.