хм ... как насчет вычисления среднего значения и округления до целого числа? round(mean(thearray))
В большинстве языков есть средства, позволяющие указать метод округления.
РЕДАКТИРОВАТЬ: Таким образом, получается, что этот вопрос действительно о предотвращении переполнения, а не о округлении. Позвольте мне прояснить, что я согласен с теми, кто сказал (в комментариях), что на практике беспокоиться не о чем, так как это происходит очень редко, и когда это происходит, вы всегда можете избежать неприятностей, используя больший тип данных
Я вижу, что несколько других людей дали ответы, которые в основном состоят из деления каждого числа в массиве на число в массиве, затем , суммируя их. Это тоже хороший подход. Но только для пинка, вот альтернатива (в псевдокоде C-ish):
int sum_offset = 0;
for (int i = 1; i < length(array); i++)
sum_offset += array[i] - array[i-1];
// round by your method of choice
int mean_offset = round((float)sum_offset / length(array));
int mean = mean_offset + array[0];
Или другой способ сделать то же самое:
int min = INT_MAX, max = INT_MIN;
for (int i = 0; i < length(array); i++) {
if (array[i] < min) min = array[i];
if (array[i] > max) max = array[i];
}
int sum_offset = max - min;
// round by your method of choice
int mean_offset = round((float)sum_offset / length(array));
int mean = mean_offset + min;
Конечно, вам нужно убедиться, что sum_offset
не переполняется, что может произойти, если разница между самым большим и самым маленьким элементами массива больше, чем INT_MAX. В этом случае замените последние четыре строки чем-то вроде этого:
// round by your method of choice
int mean_offset = round((float)max / length(array) - (float)min / length(array));
int mean = mean_offset + min;
Викторины: этот метод, или что-то в этом роде, также очень хорошо работает для умственного вычисления среднего значения массива, элементы которого сгруппированы близко друг к другу.