Я пытаюсь написать код, который проверяет, является ли число от 2 до 1000 простым числом

#java

#java

Вопрос:

 import java.util.Scanner;

public class Main {

  public static void main(String[] args) {
  
    for(int j = 2; j<=1000; j  ) {
        boolean yes = true;
        for(int i = 2; i<j amp;amp; yes== true; i  ){
            if(j%i==0) {
                yes=false;
            }
        System.out.println(j   ":"   yes); 
      } 
    }  
  }
}      
 

Я пытаюсь понять, в чем проблема, пока без какого-либо ответа.

Ответ №1:

Вам нужно System.out.println(j ":" yes); выйти из внутреннего цикла. Причина, по которой вам нужно его удалить, заключается в том, что простое число или нет, определяется только после завершения внутреннего цикла.

 public class Main {
    public static void main(String[] args) {
        for (int j = 2; j <= 1000; j  ) {
            boolean yes = true;
            for (int i = 2; i < j amp;amp; yes == true; i  ) {
                if (j % i == 0) {
                    yes = false;
                }
            }
            if (yes) {
                System.out.println(j   ":"   yes);
            }
        }
    }
}
 

Примечание: вам не требуется проверять до i < j . Это может быть i <= Math.sqrt(j) . Проверка https://en.wikipedia.org/wiki/Primality_test чтобы узнать об этом больше.

Кроме того, если вы false также хотите распечатать, не используйте if (yes) {} блок.

 public class Main {
    public static void main(String[] args) {
        for (int j = 2; j <= 1000; j  ) {
            boolean yes = true;
            for (int i = 2, n = (int) Math.sqrt(j); i <= n amp;amp; yes == true; i  ) {
                if (j % i == 0) {
                    yes = false;
                }
            }

            System.out.println(j   ":"   yes);

        }
    }
}
 

Ответ №2:

Это можно сделать с помощью потоков следующим образом:

 IntStream.range(2, 1001)
         .boxed()
         .filter(j -> IntStream.range(2, j).boxed().allMatch(i -> j % i != 0))
         .forEach(System.out::println);
 

Во-первых, мы:

  • сгенерируйте индексы от 2 до 1000 (включительно), т.Е. IntStream.range(2, 1001) ,
  • затем мы преобразуем из IntStream в Integer (т.Е. boxed() ),
  • затем мы фильтруем только простые числа

    .filter(j -> IntStream.range(2, j).boxed().allMatch(i -> j % i != 0)) ,

  • наконец, мы распечатываем результат.

Этот тип конвейера менее подвержен ошибкам, которые вы допустили в своем исходном коде.