ええと...平均を計算してから整数に丸めるのはどうですか?round(mean(thearray))
ほとんどの言語には、丸め方法を指定できる機能があります。
編集:したがって、この質問は実際には、丸めではなく、オーバーフローを回避することに関するものであることがわかります。(コメントで)実際には心配することはめったにないので、心配する必要はないと言っている人たちに同意します。そうなると、より大きなデータ型を使用することでいつでも回避できます。
基本的に、配列内の各数値を配列の数で割ってから、それらを合計するという答えを他の何人かが与えていることがわかります。それも良いアプローチです。しかし、キックのためだけに、ここに代替案があります(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より大きい場合に発生する可能性があります。その場合、最後の4行を次のように置き換えます。
// round by your method of choice
int mean_offset = round((float)max / length(array) - (float)min / length(array));
int mean = mean_offset + min;
雑学:この方法、またはそのような方法は、要素が密集している配列の平均を精神的に計算する場合にも非常にうまく機能します。