Проблемы в вашем коде:
- Вы установили значение
isPrime
в true
в пределах l oop. Вы не можете сказать, является ли число простым, пока вы не поделили его с каждым счетчиком l oop и не обнаружили, что оно не делится ни на один из счетчиков l oop. Следовательно, это должно быть сделано только после завершения l oop. - В объявлении
for (int i=4; i<=n; i++)
вы объявили i=4
для числа 5
, т.е. вы хотите установить nums [4 ] до true
, если 5
простое число или false
, если 5
не простое число. Это означает, что вы хотите проверить 5
(не 4
) на простоту. В вашем коде вы проверяли 4
на простоту.
Ниже приведен исправленный код:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter the limit: ");
int n = Integer.parseInt(input.nextLine());
boolean nums[] = new boolean[n];
for (int i = 0; i <= 2; i++) {
nums[i] = true;
}
for (int i = 3; i < n; i++) {
int num = i + 1, m = num / 2, j;
for (j = 2; j <= m; j++) {
if (num % j == 0) {
nums[i] = false;
break;
}
}
// If j>m, it means that the loop did not terminate because of `break`
if (j > m) {
nums[i] = true;
}
}
// Display nums[] for testing
System.out.println(Arrays.toString(nums));
for (int j = 0; j < n; j++) {
if (nums[j] == false) {
continue;
} else {
for (int i = 0; i <= j; i++) {
if (nums[i] == true) {
System.out.print("1");
} else {
System.out.print("0");
}
}
System.out.println();
}
}
}
}
Пример выполнения:
Enter the limit: 15
[true, true, true, false, true, false, true, false, false, false, true, false, true, false, false]
1
11
111
11101
1110101
11101010001
1110101000101
Дополнительные примечания:
- Я удалил ненужную переменную,
boolean isPrime
. Массив boolean nums[]
сам по себе достаточен. Я также напечатал nums[]
, чтобы вы могли видеть, какие значения были установлены в этом массиве. - Переменная
boolean
имеет только два значения, true
и false
. Следовательно, если вы проверяете одно значение переменной boolean
в if
, часть else
становится true
для другого значения, например, в следующем коде, else if (nums[j]==true)
не требуется, и его можно просто записать как else
.
if (nums[j]==false) {
continue;
} else if (nums[j]==true) {
//...
}
Лучший подход:
- Вы можете сделать свой код намного чище, используя отдельную функцию, чтобы определить, является ли число простым .
- Вам не нужно проверять простое число путем деления числа на каждое целое число до половины его значения; вам просто нужно разделить число на целые числа до его квадрата root. Отметьте this , чтобы узнать больше об этом.
- Обратите внимание, как мой код выглядит чище, используя троичный оператор. Отметьте this , чтобы узнать больше о троичном операторе.
public class Main {
public static void main(String[] args) {
final int N = 5;
StringBuilder sb;
for (int i = 1; i <= N; i++) {
sb = new StringBuilder();
for (int j = 1; j <= i; j++) {
sb.append(j == 1 || isPrime(j) ? 1 : 0);
}
if (sb.charAt(sb.length() - 1) != '0') {
System.out.println(sb);
}
}
}
static boolean isPrime(int n) {
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
Выход:
1
11
111
11101
Согласно вашему требованию, даже если 1
не является простым числом, для него должно быть напечатано 1
. Кроме того, согласно этому требованию нам не нужно проверять 0
или отрицательное целое число на простоту. Поэтому я не ставил в методе проверки 0
, 1
или отрицательного числа, isPrime
, чтобы он оставался чистым и соответствовал этому требованию.