2014-02-17 3 views
0

В результате я получаю 9, где я должен получать 11!Я не могу понять свою ошибку в моем PrimeGenerator

Это происходит после пятого звонка до nextPrime(). Каждый другой результат правильный, за исключением 5-го! Я пытаюсь определить свою ошибку в течение нескольких часов. Извините, если мой код неаккуратный, это то, как мой разум понял проблему! Требовалось использовать контур, управляемый флагом.

public class PrimeGenerator 
{ 
    private int num = 2; 

    public PrimeGenerator() 
    { 
    } 
    public int nextPrime() 
    { 
     boolean done = false; 

     for (int n = num; !isPrime(num); n++) 
      num = n; 

     if (isPrime(num)) 
     { 
      done = true; 
     } 

     if (done) 
     { 
      int prime = num; 
      num++; 
      return prime; 
     } 
     return num; 
    } 

    public static boolean isPrime(int n) 
    { 
     boolean result = true; 
     for (int i = 2; n % i == 0 && i < n; i++) 
      result = false; 
     if (n == 2) 
      result = true; 
     return result; 
    } 
} 

Мой тестер просто вызывает метод nextPrime() и выводит результат.

+1

Ваш метод 'isPrime' нарушен. –

+0

'for (int n = num;! IsPrime (num); n ++) num = n;' почти наверняка не то, что вы хотите. – NPE

ответ

1

Вы получаете 9 вместо 11, потому что у вас есть ошибка в методе isPrime

public static boolean isPrime(int n) 
{ 
     boolean result = true; 
     for (int i = 2; n % i == 0 && i < n; i++) 
      result = false; 
     if (n == 2) 
      result = true; 
     return result; 
} 

Посмотрите на числа 9. первая итерация: i = 2, result = true

n% i => 9% 2 = 1, поэтому ваш цикл останавливается перед первой итерацией и result не изменился.

Попробуйте изменить метод isPrime (Обновляется как прокомментировал @John в комментариях)

public static boolean isPrime(int n) 
{ 
     if(n % 2 == 0) { 
      return false; 
     } 
     double root = Math.sqrt(n); 
     for (int i = 3; i < root; i+=2) { 
      if(n % i == 0) { 
       return false; 
      } 
     } 
     return true; 
} 
+1

Петля нужно только перейти к квадратному корню из n. Также вы уже проверили деление на 2. Начните с 3 и сделайте нечетные числа. double root = Math.sqrt (n); для (int i = 3; i <корень, i + = 2) –

1

Ваш метод nextPrime возвращает num, является ли он простым. Ваш код эффективно:

if(isPrime(num)) 
    return num; 
} 
return num; 
0

Таким образом, основная проблема с кодом здесь является метод для проверки, является ли число простым. Согласно теории чисел, вам просто нужно проверить, что данное число не делится на любое число между 2 и корнем заданного числа, которое вы хотите определить, является простым. Более формально, если вы хотите проверить, является ли число n простым, вам нужно проверить, что n не делится на любое число между 2 и sqrt (n). Обновленный метод, использующий этот номер теории факт ниже:

public static boolean isPrime(int n) 
{ 
    int root = (int)Math.sqrt(n); 
    for (int i = 2; i <= root; i++) { 
     if(n % i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

С этим вашим определением простого числа было бы правильным и было бы гораздо быстрее. Существуют еще более быстрые способы определения простых чисел и создания простых чисел, таких как алгоритм решета.

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