Как найти все простые числа java

Помогите составить программу в JAVA которая принимает целое число, выводит на экран все простые числа от нуля до принятого числа. Используя только простые операции if и for
Я составил, но что-то не помогает
import java.util.Scanner;

public class prostue_chisla {
    public static void main(String[] args) {
        System.out.println("Введите положительное число: ");
        Scanner in = new Scanner(System.in);
        int input = in.nextInt();
        boolean b = true;
        for (int P = 1; P <= input; P++) {
            for (int i = 1; i < P; i++)
            {
                if (P % i == 0){
                    b = false;
                }
            System.out.println(P);}
        }

    }
}

задан 10 ноя 2017 в 19:34

Igor's user avatar

2

Если используете java 8+, лучше юзать в вашем случае IntStream для целых чисел:

public static boolean isPrime(final int number) {
   return IntStream.rangeClosed(2, number / 2).anyMatch(i -> number % i == 0);
}

Использование:

System.out.println(isPrime(1)); // false
System.out.println(isPrime(2)); // true

ответ дан 23 мая 2018 в 6:28

And's user avatar

AndAnd

4,0654 золотых знака13 серебряных знаков29 бронзовых знаков

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int top = scanner.nextInt();
    for (int i=2;i<top;i++){
        if(checkSimple(i))
            System.out.println(i);
    }
}

public static boolean checkSimple(int i){
    if (i<=1)
        return false;
    else if (i <=3)
        return true;
    else if (i%2==0 || i %3 ==0)
        return false;
    int n = 5;
    while (n*n <=i){
        if (i % n ==0 || i % (n+2) == 0)
            return false;
        n=n+6;
    }
    return true;
}

Алгоритм проверки на то, что число является простым взял отсюда : https://en.wikipedia.org/wiki/Primality_test

ответ дан 10 ноя 2017 в 19:49

aleshka-batman's user avatar

1

Проблема не со сканером, а с алгоритмом. Во-первых, он не оптимален, во-вторых, содержит ошибку. Но, если вы хотите искать простые числа именно таким способом, исправьте свой метод таким образом

public static void main(String[] args) {
    System.out.println("Введите положительное число: ");
    Scanner in = new Scanner(System.in);
    int input = in.nextInt();
    boolean b = true;
    for (int P = 2; P <= input; P++) {
        for (int i = 2; i < P; i++) {
            if (P % i == 0) {
                b = false;
                break;
            }
        }
        if (b) System.out.println(P);
        else b = true;
    }
} 

ответ дан 10 ноя 2017 в 20:32

Дмитрий's user avatar

ДмитрийДмитрий

10.2k2 золотых знака10 серебряных знаков26 бронзовых знаков

15

//variable 'input' is input numeric
for (int i = 2; i <= input; i++) {
Integer rez = i;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
rez = null;
break;
}
}
if (rez != null) {
System.out.println(rez);
}  
}

ответ дан 23 мая 2018 в 5:48

JavaJunior's user avatar

JavaJuniorJavaJunior

1,5176 серебряных знаков15 бронзовых знаков

Программа проверяет, числа от 11 и до бесконечности, и выводит количество простых чисел на экран + все простые числа + время работы программы. При желании можно отключить массив и выводить только количество простых чисел, что ускорит время работы программы процентов на 30. Без проблем можно запилить еще один метод, для проверки и вывода чисел до 10 и при помощи if проверять n<=10 – – – выбирать корректный метод.

public class reshenie {
    public static void main(String[] args) {
        int count = 4;//начинаем с 4, т.к. до 10 нам известны все простые числа и программа их не обрабатывает.
        int n = 100000;//число до которого необходимо найти все простые числа
        ArrayList<Integer> numbers = new ArrayList<>();//создаем массив, необходим для вывода чисел на экран, можно и без массива, просто выводить каждое найденное простое число
        numbers.add(2);//добавляем в массив простые числа до 10(см count = 4)
        numbers.add(3);
        numbers.add(5);
        numbers.add(7);
        Date startTime = new Date();//время старта
        for (int i = 11; i <= n; i+=2) {//проверяем все числа до нашего значения
            if (simple(i)) {//метод ниже
                count++;//меняем счетчик простых чисел
                numbers.add(i);//заносим простые в массив
            }
        }
        Date finishTime = new Date();//время окончания работы алгоритма
        long ct = finishTime.getTime() - startTime.getTime();//время работы
        System.out.println("Время вычислений: " + ct + "ms");//вывод на экран времени работы
        System.out.println("Количество простых чисел: " + count);//вывод количества
        System.out.print(numbers);//вывод всех чисел

    }

    static boolean simple(int a) {//берем число i
        int p = 0;//переменная для определения результата
            if ((a % 2 == 0)||(a%10==5)) {//исключаем числа, которые заканчиваются на 5 и четные
            return false;
        }
        else {
            for (int j = 3; j <= Math.sqrt(a); j += 2) {//делим на все нечетные числа до корня из i
                if (a % j == 0) {// если хотя бы на одно число делится, то остановка цикла, переход к следующему числу
                    p += 1; break;
                }
            }
        }
        if (p > 0) {//если p = 0, то возвращаем true, число простое
            return false;
        } else return true;

    }

}

ответ дан 11 июн 2020 в 12:03

SeregaPilot's user avatar

public static void getArrayOfPrimeNumbers(int n) {

    for (int i = 1; i <= n; i++) {
        boolean isPrime = true;//флаг
        for (int j = 2; j <= Math.floor(Math.sqrt(i)); j++){//если число i не простое,
            //то хотябы один делитель будет находится в промежутке от 2 до sqrt(i)
            if ((i % j) == 0) { //Если j - делитель числа, устанавливаем флаг на false
                isPrime = false;
                break;
            }
        }
        if (isPrime){
            System.out.print(i + " ");//если делителей нет, то флаг не изменится
        }
    }


}

ответ дан 25 июл 2020 в 18:53

Леша Пакки's user avatar

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

        }
        if (k == 2) {
            System.out.println(j + " ");
        }
    }

ответ дан 26 мая 2021 в 6:00

Ruslan's user avatar

1

Простое число – это число, которое делится нацело без остатка только на 1 и на самого себя. Также известно, что любое целое число, большее 1, является либо простым, либо может быть выражено как произведение простых чисел. Ряд простых чисел начинается с 2 и имеет следующий вид: 2, 3, 5, 7 и т.д.

Рассмотрим алгоритм поиска простых чисел, известный как «метод перебора делителей». Для этого давайте реализуем на Java метод getFirstPrimes(), который будет возвращать N первых простых чисел.

public List<Integer> getFirstPrimes(int count) {
    List<Integer> primes = new ArrayList<>();
    if (count > 0) {
        primes.add(2);
    }
    for (var i = 3; primes.size() < count; i += 2) {
        if (isPrime(i, primes)) {
            primes.add(i);
        }
    }
    return primes;
}

Все найденные простые числа будем складывать в список. Далее проверяем, что если у нас запросили хотя бы одно простое число, то сразу добавим 2, т.к. с него начинается последовательность. Далее в цикле начинаем проверять числа, сразу начиная с трёх. Также обратите внимание, что мы проверяем только нечётные числа (приращение +2), т.к. все чётные числа по определению делятся на 2.

Цикл выполняется до тех пор, пока в нашем результирующем списке не окажется ровно столько простых чисел, сколько у нас запросили. Саму проверку на «простоту» выполняем с помощью метода isPrime(), которому передаём текущее проверяемое число и уже накопленные нами на предыдущих итерациях числа.

private boolean isPrime(int n, List<Integer> primes) {
    double sqrt = Math.sqrt(n);
    for (var i = 0; i < primes.size(); i++) {
        var prime = primes.get(i);
        if (prime > sqrt) {
            return true;
        }
        if (n % prime == 0) {
            return false;
        }
    }
    return true;
}

Здесь мы сначала вызываем метод Math.sqrt(), ведь если проверяемое число состоит хотя бы из двух множителей, то ни одно из них не может превышать двоичный корень.

Затем в цикле проходим по всем уже найденным простым числам и по очереди пытаемся делить на них текущее число. Если число делится на простое число без остатка – значит, оно составное. Проверку выполняем до тех пор, пока простые числа меньше корня из проверяемого числа.

Можно выполнить небольшую оптимизацию, отказавшись от вычисления квадратного корня и операций над типом double. Вместо этого будем возводить каждое уже найденное простое число в квадрат и проверять, не превысило ли это произведение потенциально простое число. Если превысило, значит, перед нами новое простое число:

private boolean isPrime(int n, List<Integer> primes) {
    for (var i = 0; i < primes.size(); i++) {
        var prime = primes.get(i);
        if (prime * prime > n) {
            return true;
        }
        if (n % prime == 0) {
            return false;
        }
    }
    return true;
}

Рассмотренный алгоритм работает довольно быстро. За пару секунд он находит 500 000 простых чисел.

Оптимизации, которые мы применили:

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

Данный алгоритм хорошо подходит в том случае, если вам нужно ровно N первых простых чисел. Если же вы ищете все простые числа в некотором диапазоне, то лучше использовать Решето Эратосфена для поиска простых чисел – он будет работать гораздо быстрее.

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    For a given number N, the purpose is to find all the prime numbers from 1 to N.

    Examples:  

    Input: N = 11
    Output: 2, 3, 5, 7, 11
    Input: N = 7
    Output: 2, 3, 5, 7 

    Approach 1:

    • Firstly, consider the given number N as input.
    • Then apply a for loop in order to iterate the numbers from 1 to N.
    • At last, check if each number is a prime number and if it’s a prime number then print it using brute-force method.

    Java

    class gfg {

        static void prime_N(int N)

        {

            int x, y, flg;

            System.out.println(

                "All the Prime numbers within 1 and " + N

                + " are:");

            for (x = 1; x <= N; x++) {

                if (x == 1 || x == 0)

                    continue;

                flg = 1;

                for (y = 2; y <= x / 2; ++y) {

                    if (x % y == 0) {

                        flg = 0;

                        break;

                    }

                }

                if (flg == 1)

                    System.out.print(x + " ");

            }

        }

        public static void main(String[] args)

        {

            int N = 45;

            prime_N(N);

        }

    }

    Output

    All the Prime numbers within 1 and 45 are:
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 

    Time Complexity: O(N2)

    Auxiliary Space: O(1)

    Approach 2:

    • Firstly, consider the given number N as input.
    • Then apply a for loop in order to iterate the numbers from 1 to N.
    • At last, check if each number is a prime number and if it’s a prime number then print it using the square root method.

    Java

    class gfg {

        static void prime_N(int N)

        {

            int x, y, flg;

            System.out.println(

                "All the Prime numbers within 1 and " + N

                + " are:");

            for (x = 2; x <= N; x++) {

                flg = 1;

                for (y = 2; y * y <= x; y++) {

                    if (x % y == 0) {

                        flg = 0;

                        break;

                    }

                }

                if (flg == 1)

                    System.out.print(x + " ");

            }

        }

        public static void main(String[] args)

        {

            int N = 45;

            prime_N(N);

        }

    }

    Output

    All the Prime numbers within 1 and 45 are:
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 

    Time Complexity: O(N3/2)

    Approach 3:

    • Firstly, consider the given number N as input.
    • Use Sieve of Eratosthenes.

    Java

    class SieveOfEratosthenes {

        void sieveOfEratosthenes(int n)

        {

            boolean prime[] = new boolean[n + 1];

            for (int i = 0; i <= n; i++)

                prime[i] = true;

            for (int p = 2; p * p <= n; p++) {

                if (prime[p] == true) {

                    for (int i = p * p; i <= n; i += p)

                        prime[i] = false;

                }

            }

            for (int i = 2; i <= n; i++) {

                if (prime[i] == true)

                    System.out.print(i + " ");

            }

        }

        public static void main(String args[])

        {

            int N = 45;

            System.out.println(

                "All the Prime numbers within 1 and " + N

                + " are:");

            SieveOfEratosthenes g = new SieveOfEratosthenes();

            g.sieveOfEratosthenes(N);

        }

    }

    Output

    All the Prime numbers within 1 and 45 are:
    2 3 5 7 11 13 17 19 23 29 31 37 41 43 

    Time complexity : O(n*log(log(n))) 

    Auxiliary space: O(n) as using extra space for array prime

    Last Updated :
    12 Sep, 2022

    Like Article

    Save Article


    This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
    Learn more about bidirectional Unicode characters

    Show hidden characters

    //Выведите все простые числа до 100
    //число x является простым, если оно больше 1 и при этом делится без остатка только на 1 и на x
    public class lesson01 {
    public static void main(String[] args) {
    int i, j;
    boolean check;
    for (i = 2; i < 100; i++) {
    check = true;
    for (j = 2; j < i; j++) {
    if ((i % j) == 0) {
    // если число нацело разделилось на какое-либо стоящее перед ним, то это непростое (false)
    check = false;
    // System.out.print(j);
    // System.out.println(check);
    break;
    }
    }
    if (check) {
    System.out.println(i + ” простое”);
    }
    }
    }
    }

    Следующие примеры Java напечатают список всех простых чисел до 1000:

    
    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
    547	557	563	569	571	577	587	593	599	601	607	613	617	619	631	641	643	647	653	659
    661	673	677	683	691	701	709	719	727	733	739	743	751	757	761	769	773	787	797	809
    811	821	823	827	829	839	853	857	859	863	877	881	883	887	907	911	919	929	937	941
    947	953	967	971	977	983	991	997
    
    Total: 168
    

    3 примера Java:

    • Java 8 Stream и BigInteger
    • Обычная старая Ява
    • Алгоритм сита Эратосфена

    1. Java 8 Stream и BigInteger

    1.1 Использование Stream.

    PrintPrimeNumber.java

    
    package com.csharpcoderr.test;
    
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    import java.util.stream.Stream;
    
    public class PrintPrimeNumber {
    
    public static void main(String[] args) {
    
    long count = Stream.iterate(0, n -> n + 1)
    .limit(1000)
    .filter(TestPrime::isPrime)
    .peek(x -> System.out.format("%st", x))
    .count();
    
    System.out.println("nTotal: " + count);
    
    }
    
    public static boolean isPrime(int number) {
    
    if (number <= 1) return false; // 1 не простое, а также не составное
    
    return !IntStream.rangeClosed(2, number / 2).anyMatch(i -> number % i == 0);
    }
    
    }
    

    1.2 Использование BigInteger::nextProbablePrime

    
    Stream.iterate(BigInteger.valueOf(2), BigInteger::nextProbablePrime)
    .limit(168)
    .forEach(x -> System.out.format("%st", x));
    

    Или же BigInteger.TWO для Java 9

    
    Stream.iterate(BigInteger.TWO, BigInteger::nextProbablePrime)
    .limit(168)
    .forEach(x -> System.out.format("%st", x));
    

    2. Обычная старая Ява

    Нет больше Java 8 Stream, назад к основному.

    PrintPrimeNumber2.java

    
    package com.csharpcoderr.test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class PrintPrimeNumber2 {
    
    public static void main(String[] args) {
    
    List collect = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
    if (isPrime(i)) {
    collect.add(i);
    }
    }
    
    for (Integer prime : collect) {
    System.out.format("%st", prime);
    }
    
    System.out.println("nTotal: " + collect.size());
    
    }
    
    private static boolean isPrime(int number) {
    
    if (number <= 1) return false;    // 1 не простое, а также не составное
    
    for (int i = 2; i * i <= number; i++) {
    if (number % i == 0) {
    return false;
    }
    }
    return true;
    }
    
    }
    

    3. Сито Эратосфена

    Этот алгоритм Sieve of Eratosthenes очень быстро находит все простые числа.

    PS Изображение из Википедии

    Концепция такова:

    • Петля 1 # p=2 = true, следующие 4,6,8,10,12,14 … limit, all +2 set false
    • Цикл 2 # p=3 = true, следующие 6 {false, 1 #, игнорировать}, 9,12 {false, 1 #, игнорировать}, 15,18 {false, 1 #, игнорировать}, 21 … предел, все +3 установлены false
    • Петля 3 # p=4 = {ложь, 1 #, игнорировать}
    • Петля 4 # p=5 = true, следующие 10 {false, 1 #, игнорировать}, 15 {false, 2 #, игнорировать}, 20 {false, 1 #, игнорировать} … все +5 установить false
    • Петля 5 # p=6 = {ложь, 1 #, игнорировать}
    • Цикл … до предела, та же идея.
    • Соберите все true = простое число.

    PrintPrimeNumber3

    
    package com.csharpcoderr.test;
    
    import java.util.Arrays;
    import java.util.BitSet;
    import java.util.LinkedList;
    import java.util.List;
    
    public class PrintPrimeNumber3 {
    
    public static void main(String[] args) {
    
    List result = primes_soe_array(1000);
    
    result.forEach(x -> System.out.format("%st", x));
    
    System.out.println("nTotal: " + result.size());
    
    }
    
    /**
    * Sieve of Eratosthenes, true = prime number
    */
    private static List primes_soe(int limit) {
    
    BitSet primes = new BitSet(limit);
    primes.set(0, false);
    primes.set(1, false);
    primes.set(2, limit, true);
    
    for (int p = 2; p * p <= limit; p++) {
    if (primes.get(p)) {
    for (int j = p * 2; j <= limit; j += p) {
    primes.set(j, false);
    }
    }
    }
    
    List result = new LinkedList<>();
    for (int i = 0; i <= limit; i++) {
    if (primes.get(i)) {
    result.add(i);
    }
    }
    
    return result;
    
    }
    
    // Некоторые разработчики предпочитают массив.
    public static List primes_soe_array(int limit) {
    
    boolean primes[] = new boolean[limit + 1];
    Arrays.fill(primes, true);
    primes[0] = false;
    primes[1] = false;
    
    for (int p = 2; p * p <= limit; p++) {
    if (primes[p]) {
    for (int j = p * 2; j <= limit; j += p) {
    primes[j] = false;
    }
    }
    }
    
    List result = new LinkedList<>();
    for (int i = 0; i <= limit; i++) {
    if (primes[i]) {
    result.add(i);
    }
    }
    return result;
    }
    
    }
    

    Кто-нибудь может помочь преобразовать вышеупомянутый алгоритм в чистый поток Java 8? 🙂

    Рекомендации

    • Википедия – простое число
    • Таблица простых чисел и калькулятор

    Алгоритм Java Java 8 Java 9 поток простых чисел

    Примеры простых чисел в Java

    0.00 (0%) 0 votes

    Добавить комментарий