2015-10-12 2 views
0

Я не знаю, почему мой код не будет работать, когда я ввожу некоторые номера nthprime. Я пытался изменить свой код пару раз, но для каждого nthprime я заставляю его работать, я делаю это хуже для других. Поэтому, если я изменю свой код, чтобы он работал для nthprime = 8, я понимаю nthprime = 7, а некоторые другие перестают работать. Может ли кто-нибудь указать на определенный недостаток, который я сделал, или, может быть, мне следует пересмотреть схему моего кода. Спасибо.Найти nth простое число

public class NthPrime { 

public static void main(String[] args) { 

    int nthprime; 

    System.out.println("Enter value for n:"); 
    nthprime=IO.readInt(); 

    while(nthprime <= 0){ 
     System.out.println("Enter a positive value for n"); 
     nthprime=IO.readInt(); 
    } 

    if(nthprime == 1){ 
     System.out.println("The nth prime number is: "+2); 
    } 
    if(nthprime == 2){ 
     System.out.println("The nth prime number is: "+3); 
    } 

    if(nthprime > 2){ 

    int prime=2; 
    int num=3; 
    int square; 
    boolean nonprime=false; 

    while(prime < nthprime){ 
     prime++; 
     num+=2; 
     square = (int) Math.sqrt(num); 
     for (int i=3; i <= square; i++){ 
      if (num % i == 0){ 
       nonprime=true; 
       num+=2; 
      } 
      if(nonprime==false){ 
       prime++; 
       num+=2; 
      } 
     } 
    } 
    System.out.println("The nth prime number is: "+num); 
    } 
} 

}

+2

Почему вы делаете num + = 2 независимо от того, что происходит в вашем цикле for? – ergonaut

+0

@ergonaut. Правые номера не могут быть четными, поэтому, если вы добавите 2, вы пропустите четные числа. –

+2

@WyattLowery Я знаю, но он делает это в любой ветке. – ergonaut

ответ

1

Проверить этот цикл:

for (int i=3; i <= square; i++){ 
     if (num % i == 0){ 
      num+=2; 
     } 
     else { 
      prime++; 
      num+=2; 
     } 
    } 

Похоже, вы хотите перебрать все нечетные числа до квадратного корня из вашего номера. Если один из них делит, тогда он должен остановить цикл и пометить его как не-прайм. Если он не делит число, вы должны пометить его как простое, но даже это должно быть сделано после завершения цикла. (например, когда i> квадрат)

Я не хочу давать вам ответ, поскольку он кажется, что вы хотите исправить свой существующий цикл самостоятельно. Но одна стратегия заключается в том, чтобы пометить ее как не-prime (в булевом), например, а затем после цикла проверить булевское значение и прирастить ваш счетчик count (prime ++), если логическое значение указывает, что это простое. Не забудьте повторно инициализировать логическое значение, чтобы оно было правильно настроено в следующий раз, когда оно попадает в цикл for.

+0

Итак, я сделал это вместо: int prime = 2; \t \t int num = 3; \t \t int square; \t \t boolean nonprime = false; \t \t \t \t в то время как (простой

+0

Обновите свой вопрос. Комментарии не должны включать чрезмерный код, подобный этому, его трудно прочитать. – ergonaut

+0

Однако я считаю, что вы повторно инициализируете логическое значение перед целым двойным циклом, если между двумя циклами. – ergonaut

0

Создайте еще один способ проверить, является ли число простым или нет, и использовать цикл while для получения простых чисел.

public static void main(String[] args) { 
    ... 

    if (nthprime == 1) { 
     System.out.println("The nth prime number is: 2"); 
    } else { 
     int num = 3; 

     for (int i = 2; i <= nthPrime; i++) { 
      while(!isPrime(num)) { 
       num += 2; 
      } 

      num += 2; 
     } 

     System.out.println("The nth prime number is: "+ (num - 2)); 
    } 
} 

private static boolean isPrime(int n) { 
    int sqrt = (int) Math.sqrt(n); 

    for (int i = 2; i <= sqrt; i++) { 
     if (n % i == 0) { 
      return false; 
     } 
    } 

    return true; 
} 
+0

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

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