um ... как рассчитать среднее значение, а затем округление до целого числа? round(mean(thearray))
В большинстве языков есть объекты, которые позволяют указать метод округления.
EDIT: Таким образом, выясняется, что этот вопрос действительно заключается в том, чтобы избежать переполнения, а не округления. Позвольте мне пояснить, что я согласен с теми, кто сказал (в комментариях), что на практике не о чем беспокоиться, поскольку это так редко случается, и когда это происходит, вы всегда можете избежать использования большего типа данных.
Я вижу, что несколько других людей дали ответы, которые в основном состоят из деления каждого числа в массиве на счет массива, , затем, добавляя их. Это также хороший подход. Но как раз для пинков, вот альтернатива (в C-иш псевдокод):
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;
Пустяки: этот метод, или что-то, как он, также работает достаточно хорошо для умственно вычисления среднего значения массива, элементы которого сгруппированы близко друг к другу.
Добавляя искусственное ограничение не использовать больший тип данных, кажется, что вам просто сложно. Пожалуйста, объясните, почему вы не можете этого сделать. – paxdiablo
Думаю, это скорее теоретический вопрос. Здесь мы имеем простую, всюду определенную функцию, которую мы изучили в начальной школе, и, похоже, ее очень сложно вычислить, не выходя за пределы нашей функции. Более практично, не может быть более крупного типа. – fish
Всегда есть больший тип, даже если вы должны его реализовать самостоятельно. Любое другое решение рискует потерей точности, поскольку вы добавляете количество разных шкал. Это может быть допустимо, это зависит от того, что вы хотите. – paxdiablo