const maxprod = arr => {
const a = arr.slice().sort((a, b) => b - a);
const max = a[0];
const len = a.length;
let iter = 0;
for (let i = 1; i < len - 2; i++) {
iter++;
const A2 = a[i];
const x2 = max / A2;
if (!Number.isInteger(x2)) continue;
for (let j = i + 1; j < len - 1; j++) {
iter++;
const A3 = a[j];
const x3 = x2 / A3;
if (!Number.isInteger(x3)) continue;
if (!!~a.indexOf(x3)) {
return [max, A2, A3, x3, iter]);
}
}
}
return false;
}
indexOf()
всё равно перебирает массив.[
[20,5,3,2,2], // [ 20, 5, 2, 2, 3 ]
[7,9,4,60,5,3,2,2], // [ 60, 5, 4, 3, 4 ]
[1,2,3,199], // false
[2430,2431,2431,2431,1,1,1,2,3,5,7,9,11,13,15,17,19,23], // [ 2431, 17, 13, 11, 8 ]
].forEach(test => console.log(test, maxprod(test)));
2. Раскладываете А1 на множители (это куда быстрее перебора всего массива на комбинации из трех элементов).все зависит от размеров чисел. для больших чисел это может быть сверсхложной задачей
числа целые, положительные
#include <iostream>
#include <windows.h>
#include <vector>
std::vector<int> DoTheJob(std::vector<int> v)
{
int tmp;
std::vector<int> result;
bool flagfound = false;
//sorting
for(int i=0;i<v.size()-1;i++)
{
for (int j=i+1;j<v.size();j++)
{
if(v[j]>v[i])
{
tmp=v[i];
v[i]=v[j];
v[j]=tmp;
};
};
};
//sorting_end
result.push_back(v[0]);
for(int i=1; i<v.size()-2;i++)
{
if (flagfound)
{
break;
}
for(int j=i+1;j<v.size()-1;j++)
{
if (flagfound)
{
break;
};
for(int k=j+1;k<v.size();k++)
{
if (flagfound)
{
break;
};
if(v[0]==v[i]*v[j]*v[k])
{
result.push_back(v[i]);
result.push_back(v[j]);
result.push_back(v[k]);
flagfound = true;
}
};
};
}
return result;
};
int main()
{ int q = 10;
std::vector<int> v;
for (int i=0;i<q;i++)
{
v.push_back((GetTickCount()+rand())%10);
std::cout<< v[i]<<" ";
};
std::cout<<std::endl;
std::vector<int> solution = DoTheJob(v);
std::cout << "Max element: "<<solution[0];
if (solution.size()==4)
{
std::cout<<", multipliers: "<<solution[1]<<", "<< solution[2]<<", "<<solution[3];
}
else
std::cout<< ", no multipliers.";
return 0;
}