Mock Exam1 - Prime Triangle

Привет. Имам нужда от помощ и насока за решаване на задачата Primе Triangle от примерните изпити.
Явно не разбирам и подсказките с поясненията за input. Тъй като не мога да я измисля , реших първо да пробвам, как да я реша с числа и след това да мисля алгоритъм за превъртането им в 1 и 0.
За момента съм измислил това (В коментар съм оставил няколко неща):
import java.util.Scanner;
public class PrimeTriangle {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);


    int n = Integer.parseInt(scanner.nextLine());
    int count = 0;
    for (int i = 2; i <= n; i++) {
        boolean isPrime = true;
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            count++;
        }
    }
    int totalPrimes = 1 + count;
   // System.out.printf("%d", totalPrimes).println(); Check the sum of Primes;

    for (int i = 1; i <= totalPrimes; i++) {
        for (int j = 1; j <= n; j++) {
            // boolean isPrime = true;   
            // for (int k = 2; k <j ; k++) {    
            //   if (j%k==0) {                   
            //      isPrime = false;         
            //      break;      
            //  }           
            System.out.printf("%d ", j);
        }
        System.out.println();
    }
}

}

Здравей,
решаваш задачата по трудния начин, но няма да те отказвам. Ние начинаещите винаги започваме по трудния начин и след като понаучим някои нови трикове, разбираме че е имало и по-лесен начин. Няма да налагам моя начин. По-добре е да довършим твоя. В твоя случай за да продължим предлагам да добавим един масив, в който ще трупаме всички прости числа до N, за да можем да укажем на вътрешния цикъл къде да спре. Вътрешния цикъл ще си смени границата до текущото просто число от масива. Отбелязах със звездички редовете които редактирах и само добавих логиката за единиците и нулите, която е една обикновенна if-else конструкция. Обърни внимание, че няма интервали в кавичките, така е в примера. Тествай решението с “буболечката” за да видиш как работи, вкарай го в Judge и кажи колко точки дава. Помисли как можеш да го оптимизираш.

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);


    int n = Integer.parseInt(scanner.nextLine());
    int[] primes = new int[n];      //****

    int count = 0;
    for (int i = 1; i <= n; i++) {    //**** start from 1
        boolean isPrime = true;
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            primes[count] = i;     //****
            count++;
        }
    }
    int totalPrimes = 1 + count;
    // System.out.printf("%d", totalPrimes).println(); Check the sum of Primes;

    for (int i = 0; i <= totalPrimes; i++) {      //**** start from zero
        for (int j = 1; j <= primes[i]; j++) {      //****
            boolean isPrime = true;
            for (int k = 2; k < j; k++) {
                if (j % k == 0) {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) {
                System.out.print("1");
            } else {
                System.out.print("0");
            }
        }
        System.out.println();
    }
}
1 Like

Привет.
Много благодаря за решението ти. Сега ще го разгледам и осмисля. Бях сигурен, че има и др. начин след като има толкова пояснения за инпут-а. Въпреки това, снощи успях да доизгладя моя код. Сега ще разгледам твоето предложение (честно казано масив… май нямаше да се сетя за подобен род решение)

здравей Ивайло,

Благодаря за решението. имам въпрос за задачата. Малко нестандертен подхода ми. Когато дефинираме един масив за простите числа, да дефинираме и един втори масив за пирамидата (но трябва да като матрица jk). В него казваме, диагонала (края на всчки ред; не е точно диагонал) идва от масива на простите числа. Пускаме един фор цикъл, който пълни масива. Обръщането към 1 и 0 е лесно. Или когато прехвърляме на следващ ред ни е нужен и един външен цикъл, за новият ред.

Не съм писал до сега тук :slight_smile:

поздрави,
Ари