2014-10-18 3 views
0

У меня есть функция, которая находит значения простых делителей. (http://www.calculatorsoup.com/calculators/math/prime-factors.php)Как я могу оптимизировать свою функцию PrimeDivisor

Например, он принимает 12 и производят 2 * 2 * 3 = 2,3, если это потребуется 10 он будет производить 2 * 5 = 2,5, как, что

Мой код в поле ниже:

public List<Integer> findPrimeDivisor(int value) { 

     ArrayList<Integer> divisors = new ArrayList<>(); 

     int startPoint = 2; 

     if (isRound(value, startPoint)) { 
      divisors.add(startPoint); 
     } 

     while (value != 1) { 
      if (isRound(value, startPoint)) { 
       value /= startPoint; 
       continue; 
      } 
      startPoint++; 
      divisors.add(startPoint); 
     } 

     return divisors; 
    } 

    private boolean isRound(int value, int roundBy) { 
     return (value % roundBy) == 0 ? true : false; 
    } 

Как я могу сделать это более эффективно? Спасибо за ваши предложения :)

+1

Google «java factorization» для множества указателей (в том числе многих на этом сайте). – NPE

+0

Если бы это перечисляло все простые делители всех чисел его области (15?), Не было бы способа сделать это более эффективно: как только вы получите желаемый эффект, ни один другой алгоритм или реализация не будут более эффективными. Эффективность - усилие на результат - совсем другое дело; просто не забудьте включить усилия пользователя и программиста соответствующим образом. Самые большие роли в эффективном перечислении простых делителей натурального числа казались бы математикой для меня, за которой следует алгоритм, а затем кодирование - для каждого сайта есть сайты Stack Exchange. – greybeard

ответ

1

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

  • ли не рассчитывать ли является простым кандидатом или нет (это решающего значения)
  • Запускает из числа 2 и добавляет результат, если он не разделяет значения (вы должны попробовать наоборот)
  • После того, как он, наконец, находит число, которое может разделить значение, оно не добавить divident в набор результатов (опять же, вы должны пойти на противоположности здесь)

Если вы ищете способ найти их, вы можете использовать одну из многих доступных библиотек, но если вы хотите начать создавать свои собственные, я предлагаю вам начать небольшую и разделить проблему на части:

  • Способ найти простые числа (которые должны кэшировать результаты)
  • метод, чтобы попытаться все логически возможные кандидаты
  • метод, чтобы найти все логически возможные кандидаты

примером может быть:

public static void main(String[] args) 
{ 
    System.out.println(findPrimeDivisors(25)); 
    System.out.println(findPrimeDivisors(12)); 
    System.out.println(findPrimeDivisors(10)); 
    System.out.println(findPrimeDivisors(50)); 
} 

// Should be cached or maybe even hardcoded to a point 
public static boolean isPrime(int number) 
{ 
    for(int i = 2; i <= number/2; i++) 
     if(number % i == 0) 
      return false; 

    return true; 
} 

// Main loopbreaker, decides whether the next candidate should be tried or not, can be more efficient 
public static boolean tryNext(int candidate, int value) 
{ 
    return value/candidate >= 2; 
} 

public static List<Integer> findPrimeDivisors(int value) 
{ 
    List<Integer> resultList = new ArrayList<Integer>(); 

    int candidate = 2; 
    while(tryNext(candidate,value)) 
    { 
     if(isPrime(candidate) && (value % candidate == 0)) resultList.add(candidate); 
     candidate++; 
    } 

    return resultList; 
} 
+0

Спасибо за помощь, я понял свою ошибку – gokhan