Задача 1.1. У вас есть массив целых чисел, найдите наибольшее произведение из трёх чисел данного массива.
Решение.
Решение.
var unsortedArray = [-10, 7, 29, 30, 5, -10, -70];
computeProduct(unsortedArray); // 21000
function sortIntegers(a, b) {
return a - b;
}
// Наибольшее прозиведение - это (min1 * min2 * max1 || max1 * max2 * max3)
function computeProduct(unsorted) {
var sortedArray = unsorted.sort(sortIntegers),
product1 = 1,
product2 = 1,
array_n_element = sortedArray.length - 1;
// Получаем произведение трёх наибольших элементов уже отсортированного массива
for (var x = array_n_element; x > array_n_element - 3; x--) {
product1 = product1 * sortedArray[x];
}
product2 = sortedArray[0] * sortedArray[1] * sortedArray[array_n_element];
if (product1 > product2) return product1;
return product2;
}
Возникла идея, чтобы скрипт находил произведение из произвольного количества чисел данного массива.Решение.
// Массив из 21 элемента.
var unsortedArray = [-10, 7, 29, 30, 5, -10, -70, -11, 8, 28, 31, 6, -11, -71, -13, 79, 99, 32, 55, -100, -170];
// Вывод массива по элементам.
function outArrayByElement(ar) {
var i;
for (i = 0; i < ar.length; i += 1) {
document.writeln(ar[i] + '>br /<');
}
}
// Основная функция. Подсчет минимального и максимального произведений заданного количества элементов массива.
function multiPulti(ar, m) {
var n = ar.length - 1,
keys = [],
max, min,
maxAr, minAr,
tmp,
flag;
// Возвращает произведение элементов массива по переданному массиву индексов.
// Если указано, что print равно true, выводит строку из вышеуказанных значений.
function multi(_ar, print = false) {
var _i, _m;
if (print) { _m = '( '; } else { _m = 1; }
for (_i = 0; _i < _ar.length; _i += 1) {
if (print) {
_m += ar[_ar[_i]] + ' ';
} else {
_m *= ar[_ar[_i]];
}
}
if (print) { _m += ')' }
return _m;
};
// Наполнение массива индексов начальными значениями.
// Анонимная функция для ограничения области видимости переменных.
(function () {
var _i;
for (_i = 0; _i < m; _i += 1) {
keys.push(_i);
}
})();
max = min = multi(keys);
// Сердце основной функции.
// Вычисление произведения m элементов n-мерного массива.
// Вывод минимального и максимального вышеуказанных произведений.
(function () {
var _j, _k;
do {
for (_j = m - 1; _j >= 0; _j -= 1) {
flag = false;
if (keys[_j] < n - m + 1 +_j) {
keys[_j] += 1;
for (_k = _j + 1; _k < m; _k += 1) {
keys[_k] = keys[_k - 1] + 1;
}
flag = true;
_j = -1;
}
}
tmp = multi(keys);
//document.writeln(multi(keys, true) + '>br /<');
//outArrayByElement(keys);
if (tmp > max) { max = tmp; maxAr = multi(keys, true); }
if (min > tmp) { min = tmp; minAr = multi(keys, true); }
} while (flag);
document.writeln('min=' + min + ' ' + minAr + ', ' + 'max=' + max + ' ' + maxAr);
})();
}
// Первый параетр - массив элементов.
// Второй параметр - количество элементов, произведене которых нужно найти.
multiPulti(unsortedArray, 7);
Некоторые результаты (для последовательностей из 2, 3, 5, 7 и 20 чисел):min=-16830 ( 99 -170 ), max=17000 ( -100 -170 )
min=-1329570 ( 79 99 -170 ), max=1683000 ( 99 -100 -170 )
min=-9439947000 ( -71 79 99 -100 -170 ), max=8364510000 ( -70 -71 99 -100 -170 )
min=-16614306720000 ( -71 79 99 32 55 -100 -170 ), max=36343795950000 ( -70 -71 79 99 55 -100 -170 )
min=-4.641808736809999e+28 ( -10 7 29 30 -10 -70 -11 8 28 31 6 -11 -71 -13 79 99 32 55 -100 -170 ), max=2.3209043684049993e+28 ( -10 7 29 30 5 -70 -11 8 28 31 6 -11 -71 -13 79 99 32 55 -100 -170 )