Выведите простой треугольник в JAVA - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь напечатать треугольник 0 и 1. Вы получаете номер N. Если N равно 5, треугольник должен выглядеть следующим образом:

1
11
111
11101

Я получаю неправильный вывод с 27, например

1
11
111
11101
11101010
11101010001
11101010001010
11101010001010001
11101010001010001010

Строки, заканчивающиеся не простыми числами, не печатаются, простые числа печатаются как 1, а не простые как 0. У меня проблема, потому что напечатаны некоторые строки, заканчивающиеся на 0.

import java.util.Scanner;

public class PrimeTriangle {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);
        int n = Integer.parseInt(input.nextLine());
        boolean isPrime = false;
        boolean nums[] = new boolean[n];

        for (int i = 0; i <= 2; i++) {
            nums[i] = true;
            // System.out.print(nums[i]);
        }

        for (int i = 4; i <= n; i++) {
            int m = i / 2;
            for (int j = 2; j <= m; j++) {
                if (i % j == 0) {
                    isPrime = false;
                    break;
                } else {
                    isPrime = true;
                }
            }
            nums[i - 1] = isPrime;
        }

        for (int j = 0; j < n; j++) {
            if (nums[j] == false) {
                continue;
            } else if (nums[j] == true) {
                for (int i = 0; i < j; i++) {
                    if (nums[i] == true) {
                        System.out.print("1");
                    } else if (nums[i] == false && /* nums[j-1]==true && */ i + 1 < j - 1) {
                        System.out.print("0");
                    } else {
                        continue;
                    }
                }
                System.out.println();
                // System.out.println(" i= " + j + " " );
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Используйте Сито Эратосфена , чтобы построить char[] из 0 и 1, затем напечатайте все подстроки, заканчивающиеся на 1.

static void printPrimeTriangle(int n) {
    char[] primes = new char[n];
    Arrays.fill(primes, '1');
    for (int sqrt = (int) Math.sqrt(n) + 1, i = 1; i < sqrt; i++)
        if (primes[i] == '1')
            for (int prime = i + 1, j = prime * 2 - 1; j < n; j += prime)
                primes[j] = '0';
    for (int i = 0; i < n; i++)
        if (primes[i] == '1')
            System.out.println(new String(primes, 0, i + 1));
}

Тест

printPrimeTriangle(80);

Выход

1
11
111
11101
1110101
11101010001
1110101000101
11101010001010001
1110101000101000101
11101010001010001010001
11101010001010001010001000001
1110101000101000101000100000101
1110101000101000101000100000101000001
11101010001010001010001000001010000010001
1110101000101000101000100000101000001000101
11101010001010001010001000001010000010001010001
11101010001010001010001000001010000010001010001000001
11101010001010001010001000001010000010001010001000001000001
1110101000101000101000100000101000001000101000100000100000101
1110101000101000101000100000101000001000101000100000100000101000001
11101010001010001010001000001010000010001010001000001000001010000010001
1110101000101000101000100000101000001000101000100000100000101000001000101
1110101000101000101000100000101000001000101000100000100000101000001000101000001

....:....1....:....2....:....3....:....4....:....5....:....6....:....7....:....8
0 голосов
/ 03 мая 2020

Проблемы в вашем коде:

  1. Вы установили значение isPrime в true в пределах l oop. Вы не можете сказать, является ли число простым, пока вы не поделили его с каждым счетчиком l oop и не обнаружили, что оно не делится ни на один из счетчиков l oop. Следовательно, это должно быть сделано только после завершения l oop.
  2. В объявлении 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

Дополнительные примечания:

  1. Я удалил ненужную переменную, boolean isPrime. Массив boolean nums[] сам по себе достаточен. Я также напечатал nums[], чтобы вы могли видеть, какие значения были установлены в этом массиве.
  2. Переменная boolean имеет только два значения, true и false. Следовательно, если вы проверяете одно значение переменной boolean в if, часть else становится true для другого значения, например, в следующем коде, else if (nums[j]==true) не требуется, и его можно просто записать как else.
if (nums[j]==false) {
    continue;
} else if (nums[j]==true) {
    //...
}

Лучший подход:

  1. Вы можете сделать свой код намного чище, используя отдельную функцию, чтобы определить, является ли число простым .
  2. Вам не нужно проверять простое число путем деления числа на каждое целое число до половины его значения; вам просто нужно разделить число на целые числа до его квадрата root. Отметьте this , чтобы узнать больше об этом.
  3. Обратите внимание, как мой код выглядит чище, используя троичный оператор. Отметьте 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, чтобы он оставался чистым и соответствовал этому требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...