Как вычислить среднее значение элементов в массиве беззнаковых символов?
У меня есть быстрый, и я предполагаю, что вопрос, но я не смог ничего найти в интернете.
Как вычислить среднее число элементов в массиве беззнаковых символов? Или, скорее, выполнять операции с неподписанным символом?
3 ответа:
Арифметические операции прекрасно работают на
unsigned char
, хотя иногда вас может удивить тот факт, что арифметика В C всегда способствуетint
.В стандартной библиотеке шаблонов C++,
Для вычисления суммы#include <numeric> template<class InputIterator, class T> T accumulate(InputIterator first, InputIterator last, T init);
unsigned char arr[]
можно использоватьaccumulate(arr, arr + sizeof(arr) / sizeof(arr[0]), 0)
. (0 - этоint
здесь. Возможно, вы сочтете более целесообразным использовать другой тип.)Без STL это тривиально вычисляется с помощью цикла.
Среднее - это сумма, деленная на длину (sizeof(arr) / sizeof(arr[0])
).
C++03 и C++0x:
#include <numeric> int count = sizeof(arr)/sizeof(arr[0]); int sum = std::accumulate<unsigned char*, int>(arr,arr + count,0); double average = (double)sum/count;
Онлайн-демонстрация: http://www.ideone.com/2YXaT
Только C++0x (с использованием лямбды)
#include <algorithm> int sum = 0; std::for_each(arr,arr+count,[&](int n){ sum += n; }); double average = (double)sum/count;
Онлайн-демонстрация: http://www.ideone.com/IGfht
Примерно так же, как и все остальное, вы складываете их и делите на количество. Чтобы избежать переполнения, вы, как правило, хотите преобразовать их во что-то большее, пока вы делаете математику. Если (как это часто бывает) вы хотите получить результат с плавающей точкой, вы также захотите сделать всю математику с плавающей точкой.