Посчитать арифметическое среднее без переполнения?
Так как это не просто трюк, а может быть полезно, например, в таких вот случаях, кину отдельной заметкой.
Попытаемся посчитать арифметическое среднее от двух больших числовых значений, например, равных INT_MAX
, обычным способом:
#include <iostream> using namespace std; int average(int a, int b) { return (a + b) / 2; } int main() { int a = INT_MAX, b = INT_MAX; cout << "a = b = : " << INT_MAX << endl; cout << "Average = " << average(a, b); cin.get(); return 0; }
Мой QT на это выдал:
a = b = : 2147483647 Average = -1
А теперь примением в функции average
"улучшенную формулу":
return a/2 + b/2 + (a%2 + b%2)/ 2;
Результат равен 2147483647, то есть, корректен. Подумайте, для всех ли значений будет так и почему :)
18.03.2018, 10:07 [2452 просмотра]