dev/c/avg_task/avg_arr.c
Kolan Sh 7359589f6d вычисление среднего для знаковых целых и массивов (ну и парсер TeX немного)
--HG--
rename : c/tex_parser/get_tags.sh => cpp/tex_parser/get_tags.sh
rename : c/tex_parser/tables4.tex => cpp/tex_parser/tables4.tex
rename : c/tex_parser/tables5.tex => cpp/tex_parser/tables5.tex
rename : c/tex_parser/tex_table_class.hpp => cpp/tex_parser/tex_table_class.hpp
rename : c/tex_parser/tex_table_class_tags.hpp => cpp/tex_parser/tex_table_class_tags.hpp
2011-06-07 19:08:15 +04:00

55 lines
760 B
C

#include <stdio.h>
#include <stdlib.h>
int avg(size_t N, int *a)
{
size_t i;
int mean = 0,
rem = 0;
for (i = 0; i < N; i++) {
int tmp = a[i] - mean;
int ii = (int)i;
mean += tmp / (ii + 1);
rem += tmp % (ii + 1);
if (abs(rem) > ii) {
if (rem > 0) {
rem -= ii + 1;
mean++;
}
else {
rem += ii + 1;
mean--;
}
}
}
// округление до ближайшего целого
//~ if (abs(rem) > ii / 2)
//~ if (rem > 0)
//~ mean++;
//~ else
//~ mean--;
return mean;
}
int main(int argc, char *argv[])
{
const size_t N = 88;
int *a = (int *)malloc(N * sizeof(int));
size_t i;
for (i = 0; i < N; i++)
a[i] = rand() % 1024;
printf("avg(a[]) = %d\n", avg(N, a));
free(a);
return 0;
}