Список простых чисел - PullRequest
0 голосов
/ 28 мая 2019

Я студент-любитель, изучающий java, и мой учитель дал мне задание, состоящее в написании кода, в котором перечислены первые 100 простых чисел.Вот то, что я пробовал до сих пор.

for(int i =1; true; i++) {
    int k = 0;
    for(int j = 1; j <= i; j++) {
        if(i % j == 0){
            k ++;
        }

        if(k == 2) {
            System.out.println(i);
        }
    }
}

Проблема, с которой я столкнулся, заключается в том, что я не мог не остановить консоль для остановки после счета 100, даже если я использовал возможные механизмы, с которыми я знаком,например:

for( int i =1; true; i++) {
    int k = 0;
    for(int j = 1; j <= i; j++) {
        if(i % j == 0) {
            k ++;
        }

        int m = 0;
        if(k == 2) {
            System.out.println(i);
            m++;
            if(m==100) {
                break;
            }
        }
    }
}

Могу ли я получить помощь в завершении цикла после подсчета 100 простых чисел?

Ответы [ 3 ]

2 голосов
/ 28 мая 2019

Вам необходимо отслеживать, сколько простых чисел вы напечатали, как только оно достигнет 100, прекратите печать.Я объяснил код ниже, используя комментарии в коде.

public class Main
{
    public static void main(String[] args) {
        int k = 0;  // to keep track of how many primes you have prited
        int i = 2;  // number to check for prime, increases every loop
        while (k < 100){  // while you have printed less than 100 primes
            boolean isPrime = true;  // next few lines are checking i for prime and store it in this variable
            for(int divisor = 2; divisor <= i / 2; divisor++) {  // you should go with divisor <= Math.sqrt(i) in condition, I couldn't be bothered in import stuff.
                if (i % divisor == 0) {
                    isPrime = false;
                    break; // i is not a prime, no reason to continue checking
                }
            }
            if (isPrime){
                System.out.println(i);  // if i is prime, print it
                k ++; // increase k by when a print number is found
            }
            i ++; // increase i to check next number
        }
    }
}
1 голос
/ 28 мая 2019

Ваш код работает до бесконечности, потому что вы поместили свой break в неправильную точку.Ваш break выходит из внутреннего цикла, который является for(int j = 1; j <= i; j++), хотя вы должны нацеливаться на внешний цикл for( int i =1; true; i++), поскольку именно это решает, сколько чисел будет печатать внутренний цикл, просто чтобы проверить, простое ли число.

Я исправил ваш подход в этом коде (объяснение в комментариях)

int numbersPrinted = 0; // To keep track of how many numbers have been printed
for (int i = 2; true; i++) {
    boolean isPrime = true; // Assuming the number is prime
    for (int j = 2; j < i; j++) {
        // Checking if any number from 2 to i-1 completely divides i
        if (i % j == 0) {
            // If a number completely divides (gives 0 remainder)
            // The number is not prime
            isPrime = false;
            // You can use break here. I don't think it matters anyways.
        }
    }
    if (isPrime) {
        // Printing i only if it is prime
        System.out.print(i + ", ");
        numbersPrinted++; // Updating the numbersPrinted
    }
    // Checking if the numbers printed is grater than or equal to 100
    if (numbersPrinted >= 100)
        // This will break the outermost loop
        // This is where you messed up
        break;
}

Вывод (ровно 100 простых чисел)

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 
0 голосов
/ 28 мая 2019

Чтобы ответить на ваш вопрос, как остановиться на 100:

for( int i =1; i<=100; i++){

Вторым аргументом оператора for является условие продолжения. Если это условие оценивается как ложное, цикл for прекращает итерацию.

...