2016-01-20 2 views
2

Мое решение проблемы ниже дает правильный ответ в компиляторе, но отклоняется онлайн-судьей из-за следующей ошибки: 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; 
} 
+0

Есть ли у вас выборочные входные данные для случая «из памяти»? – Georgy

+0

@Georgy No. Онлайн-судья передает все случаи, но не выполняет решение, так как говорит, что для запуска решения требуется более 600 мс, поэтому оно завершено. –

+0

Это интересно. Они могут дать вам действительно большое количество, простое или очень большое количество чисел, и вы попытаетесь найти факторизацию на века. Также странно, что они говорят: «Это разложение может быть не самым практичным». Математически это утверждение ничего не значит здесь.Вам лучше спросить их через справочный центр. Также попробуйте проверить ввод 0. Дикая догадка, но почему бы и нет?) – Georgy

ответ

0

Ваша проблема заключается в том, что вы вводите бесконечный цикл, если вам передано 0. Вы должны сделать 0 и негативы в специальный cas эс.

+0

Существует условие ввода, которое говорит, что вход больше 0 –

+0

@Varun. Где указано это условие ввода? Спектр говорит, что ввод недопустим, и что вернуть, если вы получили недопустимый ввод. Вы должны ожидать тестовые случаи, когда вы передали недопустимый ввод, чтобы убедиться, что вы поступаете правильно. Прямо сейчас нет. – btilly

Смежные вопросы