Мое решение проблемы ниже дает правильный ответ в компиляторе, но отклоняется онлайн-судьей из-за следующей ошибки: JS Allocation failed - процесс из памяти. Что я должен изменить в своем алгоритме, чтобы избавиться от этой ошибки?Как управлять памятью в этом алгоритме Javascript?
Codewars Kata: Вы должны закодировать функцию getAllPrimeFactors, которая принимает целочисленное значение как параметр и возвращает массив, содержащий его основное декомпозицию, по возрастающим коэффициентам, если в разложении появляются много раз в разложении, оно должно появляться столько раз в массиве ,
Exemple:
getAllPrimeFactors(100) returns [2,2,5,5] in this order.
Это разложение не может быть наиболее практичным.
Вы также должны написать getUniquePrimeFactorsWithCount, функцию, которая вернет массив, содержащий два массива: один с простыми числами, входящими в разложение, а другой содержащий их соответствующую мощность.
Exemple:
getUniquePrimeFactorsWithCount(100) returns [[2,5],[2,2]]
Вы также должны написать getUniquePrimeFactorsWithProducts массив, содержащий простые множители в их соответствующих полномочий.
Exemple:
getUniquePrimeFactorsWithProducts(100) returns [4,25]
ошибки, если:
п не является числом п не является целым числом п является отрицательным или 0 Три функции должны соответственно возвращать
[], [[],[]] and [].
Поясные кейсы:
if n=0, the function should respectively return [], [[],[]] and [].
if n=1, the function should respectively return [1], [[1],[1]], [1].
if n=2, the function should respectively return [2], [[2],[1]], [2].
Результат для n = 2 является нормальным. Результат для n = 1 произволен и выбран для возврата полезного результата. Результат для n = 0 также произволен, но не может быть выбран как полезным, так и интуитивным.
([[0],[0]]
будет значимым, но не будет работать для общего использования разложения,
[[0],[1]]
будет работать, но не интуитивно)
Вот мой алгоритм:.
function getAllPrimeFactors(n) {
var fact=[];
while(n%2===0)
{
fact.push(2);
n=n/2;
}
var i=3;
while(i<=Math.floor(Math.sqrt(n)))
{
while(n%i===0)
{
fact.push(i);
n=n/i;
}
i++;
}
if(n>2)
{
fact.push(n);
}
return fact;
}
function getUniquePrimeFactorsWithCount(n) {
var fact=getAllPrimeFactors(n);
var i=0;
var count=[];
var unique=[];
var c=0;
while(i<fact.length)
{
if(fact[i]===fact[i+1])
{
c++;
}
else
{
count.push(c+1);
c=0;
unique.push(fact[i]);
}
i++;
}
var fact_count=[];
fact_count.push(unique);
fact_count.push(count);
return fact_count;
}
function getUniquePrimeFactorsWithProducts(n) {
var fact_count=getUniquePrimeFactorsWithCount(n);
var fact_prod=[];
var i=0;
while(i<fact_count[0].length)
{
var prod=1;
var j=1;
while(j<=fact_count[1][i])
{
prod*=fact_count[0][i];
j++;
}
fact_prod.push(prod);
i++;
}
return fact_prod;
}
Есть ли у вас выборочные входные данные для случая «из памяти»? – Georgy
@Georgy No. Онлайн-судья передает все случаи, но не выполняет решение, так как говорит, что для запуска решения требуется более 600 мс, поэтому оно завершено. –
Это интересно. Они могут дать вам действительно большое количество, простое или очень большое количество чисел, и вы попытаетесь найти факторизацию на века. Также странно, что они говорят: «Это разложение может быть не самым практичным». Математически это утверждение ничего не значит здесь.Вам лучше спросить их через справочный центр. Также попробуйте проверить ввод 0. Дикая догадка, но почему бы и нет?) – Georgy