Код по Visitor может быть упрощена далее:
const int array_sum(std::accumulate(a, a + array_size, 0));
int sum(array_sum * array_sum);
for (int i = 0; i < array_size; ++i) {
sum -= a[i] * a[i];
}
И я предполагаю, что временный мог б е используется:
const int array_sum(std::accumulate(a, a + array_size, 0));
int sum(array_sum * array_sum);
for (int i = 0; i < array_size; ++i) {
const int tmp(a[i]);
sum -= tmp * tmp;
}
И, конечно, шаг возведения в квадрат также можно сделать с помощью STL:
const int array_sum(std::accumulate(a, a + array_size, 0));
std::transform(a, a + array_size, a, a, std::multiplies<int>()); // store in a
const int sum(array_sum * array_sum - std::accumulate(a, a + array_size, 0));
EDIT: Простой цикл за один проход:
int array_sum(0), square_sum(0);
for(int i(0) ; i < array_size; ++i)
{
int tmp(a[i]);
array_sum += tmp;
square_sum += tmp * tmp;
}
const int sum( array_sum * array_sum - square_sum);
Некоторая ясность в отношении свойств (commutavity и т. Д.) Набора 'A' может быть полезна. – dirkgently
Я думал, что это было хорошо прочитано и связано с вашим вопросом: http://wordaligned.org/articles/next-permutation – Manuel
Из-за ассоциативных свойств умножения 'a * b' совпадает с' b * a', который является '2 * a * b'. Кроме того, как может 'a * c! = C * a'? Я бы упростил алгебру перед кодированием. –