#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))
, - наконец, мы распечатываем результат.
Этот тип конвейера менее подвержен ошибкам, которые вы допустили в своем исходном коде.