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

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given an array arr[] of N positive integers. The task is to write a program to count the number of prime elements in the given array.

    Examples

    Input: arr[] = {1, 3, 4, 5, 7}
    Output: 3
    There are three primes, 3, 5 and 7
    
    Input: arr[] = {1, 2, 3, 4, 5, 6, 7}
    Output: 4

    Naive Approach: A simple solution is to traverse the array and keep checking for every element if it is prime or not and keep the count of the prime elements at the same time.

    Efficient Approach: Generate all primes upto maximum element of the array using sieve of Eratosthenes and store them in a hash. Now traverse the array and find the count of those elements which are prime using the hash table. 

    Below is the implementation of above approach: 

    C++

    #include <bits/stdc++.h>

    using namespace std;

    int primeCount(int arr[], int n)

    {

        int max_val = *max_element(arr, arr+n);

        vector<bool> prime(max_val + 1, true);

        prime[0] = false;

        prime[1] = false;

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

            if (prime[p] == true) {

                for (int i = p * 2; i <= max_val; i += p)

                    prime[i] = false;

            }

        }

        int count = 0;

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

            if (prime[arr[i]])

                count++;   

        return count;

    }

    int main()

    {

        int arr[] = { 1, 2, 3, 4, 5, 6, 7 };

        int n = sizeof(arr) / sizeof(arr[0]);

        cout << primeCount(arr, n);

        return 0;

    }

    Java

    import java.util.Arrays;

    import java.util.Vector;

    class GFG

    {

        static int primeCount(int arr[], int n)

        {

            int max_val = Arrays.stream(arr).max().getAsInt();

            Boolean[] prime = new Boolean[max_val + 1];

            for (int i = 0; i < max_val + 1; i++)

            {

                prime[i] = true;

            }

            prime[0] = false;

            prime[1] = false;

            for (int p = 2; p * p <= max_val; p++)

            {

                if (prime[p] == true)

                {

                    for (int i = p * 2; i <= max_val; i += p)

                    {

                        prime[i] = false;

                    }

                }

            }

            int count = 0;

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

            {

                if (prime[arr[i]])

                {

                    count++;

                }

            }

            return count;

        }

        public static void main(String[] args)

        {

            int arr[] = {1, 2, 3, 4, 5, 6, 7};

            int n = arr.length;

            System.out.println(primeCount(arr, n));

        }

    }

    Python3

    from math import sqrt

    def primeCount(arr, n):

        max_val = arr[0];

        for i in range(len(arr)):

            if(arr[i] > max_val):

                max_val = arr[i]

        prime =[ True for i in range(max_val + 1)]

        prime[0] = False

        prime[1] = False

        k = int(sqrt(max_val)) + 1

        for p in range(2, k, 1):

            if (prime[p] == True):

                for i in range(p * 2, max_val + 1, p):

                    prime[i] = False

        count = 0

        for i in range(0, n, 1):

            if (prime[arr[i]]):

                count += 1

        return count

    if __name__ == '__main__':

        arr = [1, 2, 3, 4, 5, 6, 7]

        n = len(arr)

        print(primeCount(arr, n))

    C#

    using System;

    using System.Linq;

    class GFG

    {

        static int primeCount(int []arr, int n)

        {

            int max_val = arr.Max();

            Boolean[] prime = new Boolean[max_val + 1];

            for (int i = 0; i < max_val + 1; i++)

            {

                prime[i] = true;

            }

            prime[0] = false;

            prime[1] = false;

            for (int p = 2; p * p <= max_val; p++)

            {

                if (prime[p] == true)

                {

                    for (int i = p * 2; i <= max_val; i += p)

                    {

                        prime[i] = false;

                    }

                }

            }

            int count = 0;

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

            {

                if (prime[arr[i]])

                {

                    count++;

                }

            }

            return count;

        }

        public static void Main()

        {

            int []arr = {1, 2, 3, 4, 5, 6, 7};

            int n = arr.Length;

            Console.WriteLine(primeCount(arr, n));

        }

    }

    PHP

    <?php

    function primeCount($arr, $n)

    {

        $max_val = max($arr);

        $prime = array_fill(0, $max_val + 1, true);

        $prime[0] = false;

        $prime[1] = false;

        for ($p = 2; $p * $p <= $max_val; $p++)

        {

            if ($prime[$p] == true)

            {

                for ($i = $p * 2;

                     $i <= $max_val; $i += $p)

                    $prime[$i] = false;

            }

        }

        $count = 0;

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

            if ($prime[$arr[$i]])

                $count++;

        return $count;

    }

    $arr = array(1, 2, 3, 4, 5, 6, 7 );

    $n = sizeof($arr);

    echo primeCount($arr, $n);

    ?>

    Javascript

    <script>

    function primeCount(arr, n)

    {

        let max_val = arr.sort((a, b) => b - a)[0];

        let prime = new Array(max_val + 1).fill(true);

        prime[0] = false;

        prime[1] = false;

        for (let p = 2; p * p <= max_val; p++)

        {

            if (prime[p] == true)

            {

                for (let i = p * 2;

                    i <= max_val; i += p)

                    prime[i] = false;

            }

        }

        let count = 0;

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

            if (prime[arr[i]])

                count++;

        return count;

    }

    let arr = new Array(1, 2, 3, 4, 5, 6, 7 );

    let n = arr.length;

    document.write(primeCount(arr, n));

    </script>

    Last Updated :
    01 Sep, 2022

    Like Article

    Save Article

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

    Примеры:

    Входные данные

    5 –» 1 2 3 4 5

    Результат работы

    0 0 1 2 2

    Входные данные

    11 –» 2 3 5 7 11 13 17 19 23 29 31

    Результат работы

    0 1 2 3 4 5 6 7 8 9 10

     ```
          #include <iostream>
    
          int main() 
         {
           int n;
           std::cin >> n;
           int arr[100];
           for (int i = 0; i < n; i++)
           {
           std::cin >> arr[i];
           }
           std::cout << "N of primes:";
           for (int i = 0; i < n ; i++)
           {
           for (int j = 2; j <= arr[i] / 2; j++)
           {
            if (arr[i] % j == 0 && arr[i] != j)
            {
                arr[i] = 0;
                break;
               }
            }
            if (arr[i] != 0)
            {
               std::cout << arr[i] << " ";
             }
            }   
           }
          ```
    

    я начинающий в C++ поэтому мне нужны простые решение задачи

    спасибо заранее!

    задан 25 июн 2020 в 19:39

    Const_Int's user avatar

    Я добавил в код комментарии, чтобы было понятнее.

    #include <iostream>
    int main(){
        // заведем переменную, в которой будем хранить кол-во простых чисел
        long long counter = 0;
        long long n; std::cin >> n;
        // считаем количество вводимых чисел
        for(long long i = 0; i < n; ++i){
            // будем считывать N простых чисел и проверять их на простоту. Переменна flag нужна как переключатель - простое число или нет
            bool flag = true;
            long long tmp; std::cin >> tmp;
            // выведем счетчик
            std::cout << counter << " ";
            // проверка на простоту
            if(tmp == 1) continue; // 1 - не простое число, уходим на новую итерацию
            for(long long d = 2; d * d <= tmp; d++){
                if(tmp % d == 0) flag = false; // если число не простое, не будем увеличиваь счетчик
            }
            if(flag) counter++;
        }
    }
    
    

    ответ дан 25 июн 2020 в 20:01

    Nosorog's user avatar

    NosorogNosorog

    461 серебряный знак6 бронзовых знаков

    7

        ```
          #include <iostream>
    
           int main() {
           unsigned int n, count = 0, num;
           std::cin >> n;
           int arr[100];
           for (int i = 0; i < n; ++i) {
           std::cin >> arr[i];
           }
           for (int i = 0; i < n; ++i) {
           std::cout << count << " ";
    
           num = arr[i];
           if (num == 2)
           count++;
           if (num < 2 || num % 2 == 0)
           continue;
           int j;
           for (j = 2; j < num; j++)
           if (num % j == 0)
           break;
           if (j * j > num)
           count++;
           }
           }
         ```
    

    как решить проблему когда вводятся 10 чисел например –» 3 5 7 11 13 17 19 23 29 31
    Правильный ответ был 1 2 3 4 5 6 7 8 9 10

    сейчас программа дает ответ 0 1 2 3 4 5 6 7 8 9

    ответ дан 25 июн 2020 в 22:42

    Const_Int's user avatar

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

    Необходимо реализовать алгоритм, который будет считать количество простых чисел в выданном массиве. Ограничение по памяти 256 Мб, по времени 1 секунда.
    Формат ввода

    • В первой строке содержится единственное число 1 ≤ n ≤ 1000 – размер выборки
    • Во второй строке содержится n целых чисел 2 ≤ ai ≤ 1012 – выборка

    Sample Input 3:
    5
    15 17 2 8 15
    Sample Output 3:
    2

    Проблема в верхнем пределе возможного числа в выборке, когда оно действительно приближается к 12 нулям выпадают исключения типа MemoryError, а если решить и эту проблему, то алгоритм не укладывается в необходимую 1 секунду.
    Пытался использовать решето Эратосфена в различных реализациях, но ничего не вышло. Подозреваю, что возможно решить с помощью генераторов, но моих скиллов пока не хватает.


    • Вопрос задан

      более года назад

    • 379 просмотров

    Тут не нужно решето. Надо просто отдельно проверить каждое число на простоту.

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

    Пригласить эксперта

    Непонятно, откуда у вас MemoryError. Если исходная выборка размещена в памяти, и ей хватило там места, то на что у вас расходуется память? Вам ведь не надо запоминать все полученные простые числа. Вы берете их по одному и просто выясняете – простое оно или нет.
    Вот со временем – да, если у вас действительно большие числа и их к тому-же много – ну тогда переборный алгоритм быстрый не будет. Поэтому ограничение в 1 сек. – это просто какая-то мягко говоря странность, если не указывать, а какие именно числа в вашей последовательности. Для 1000 чисел, всех лежащих в диапазоне от 0 до 1001 – это одно, а для лежащих в диапазоне от 10**12-1000 до 10**12 – это совсем разное время работы.

    Задача явно требует расчёта этих самых простых чисел и переиспользования списка.

    Так что сначала генерим список простых чисел во вменяемом диапазоне, скажем, до тысячи. Берём очередное число. Если оно меньше квадрата самого большого из простых чисел списка, проверяем, что оно делится или не делится на какое-то из них. А если больше – просто перед проверкой догенерируем в список простые числа до нужного порога. При этом используем повторно ту же самую процедуру проверки числа на простоту.

    Нет, конечно, можно и сразу нагенерить простых до миллиона, но смысл?


    • Показать ещё
      Загружается…

    18 мая 2023, в 17:43

    3000 руб./за проект

    18 мая 2023, в 17:40

    2000 руб./за проект

    18 мая 2023, в 17:26

    1500 руб./за проект

    Минуточку внимания

    Раздел:
    Задачи /
    Простейшие /

    Как определить простое число

    Основы программирования 2.0

    Основы программирования
    Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать.
    Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь.
    Подробнее…

    Условие задачи 2.30

    Задача 2.30
    Дан одномерный массив А, состоящий из натуральных чисел. Вывести на экран количество простых чисел в массиве.

    Для начала напомню, что такое простые числа.

    Простое число – это натуральное число, которое имеет ровно два различных натуральных делителя – единицу и самого себя.

    То есть если число делится без остатка только на 1 и на самого себя, то такое число является простым.

    Например, простыми числами являются 2, 3, 5 и т.п.

    А вот 4 уже не является простым, так как делится без остатка не только на 1 и 4, но ещё и на 2.

    Если вы подзабыли, что такое натуральное число, то см. здесь.

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

    Как определить простое число в Паскале

    Алгоритм решения с подробным разбором приведу на Паскале. Решение на С++ можете посмотреть в примере программы на С++.

    ВАЖНО!
    На этом многие могут ошибиться. В определении сказано, что простое число имеет
    ровно два различных делителя. Следовательно, число 1 не является простым (также не является простым, так как ноль можно делить на любые числа).

    Проверять, является ли число простым, будем с помощью функции, которую сами и создадим. Эта функция будет возвращать TRUE, если число простое.

    В функции сначала будем проверять, не является ли число меньше двух. Если да, то это уже не простое число. Если же число равно 2 или 3, то оно является однозначно простым и делать какие-то дополнительные проверки не требуется.

    А вот если число N будет больше трёх, то в этом случае в цикле будем перебирать все возможные делители, начиная от 2 до (N-1). Если на какой-то делитель число N делится без остатка, значит, это тоже не простое число. В этом случае мы прерываем цикл (потому что проверять дальше нет смысла), а функция возвращает FALSE.

    Проверять, делится ли число на самоё себя нет смысла (поэтому цикл длится только до N-1).

    Саму функцию здесь приводить не буду – посмотрите её в примерах программ.

    Решение задачи 2.30 на Паскале

     
    program mytask;
    
    //****************************************************************
    // КОНСТАНТЫ
    //****************************************************************
    const
      COUNT = 100;        //Количество элементов в массиве
    
    //****************************************************************
    // ФУНКЦИИ И ПРОЦЕДУРЫ
    //****************************************************************
    
    //****************************************************************
    // Проверяет, является ли число простым
    // ВХОД  : N - число
    // ВЫХОД : TRUE - число N простое, FALSE - не простое
    //****************************************************************
    function IsPrimeNumber(N : WORD) : boolean;
    var i : WORD;
    begin
      Result := TRUE;
      case N of
      0..3 :
        begin
          if N < 2 then Result := FALSE;  //Не простое число
          Exit;
        end;
      end;
      for i := 2 to (N-1) do
        if (N mod i) = 0 then             //Не простое число
          begin
            Result := FALSE;
            Break;
          end;
    end;
    
    var i : WORD;
        X : WORD = 0;
        A : array[1..COUNT] of WORD;
    
    //****************************************************************
    // ОСНОВНАЯ ПРОГРАММА
    //****************************************************************
    begin
      //Заполнить массив числами
      for i := 1 to COUNT do
        A[i] := i;
    
      //Подсчитать и выбрать простые числа из массива
      for i := 1 to COUNT do
        if IsPrimeNumber(A[i]) then
          begin
            Inc(X);
            Write(A[i], ' ');
          end;
    
      WriteLn(#10#13'Number of Prime numbers = ', X);
    
      WriteLn('The end. Press ENTER...');
      ReadLn;
    end.
    

    Решение задачи 2.30 на С++

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    //****************************************************************
    // КОНСТАНТЫ
    //****************************************************************
    const int COUNT = 100;        //Количество элементов в массиве 
    
    //****************************************************************
    // ФУНКЦИИ И ПРОЦЕДУРЫ
    //****************************************************************
    
    //****************************************************************
    // Проверяет, является ли число простым
    // ВХОД  : N - число
    // ВЫХОД : TRUE - число N простое, FALSE - не простое
    //****************************************************************
    bool IsPrimeNumber(int N)    
    {
      bool Res = true;
      switch (N)
      {
        case 0  : Res = false; break;
        case 1  : Res = false; break;
        case 2  : Res = true;  break;
        case 3  : Res = true;  break;
        default : 
          for (int i = 2; i < N; i++)
            if (0 == (N % i))            //Не простое число
              {
                Res = false;
                break;
              } 
      }
      return(Res);
    }
    
    //****************************************************************
    // ОСНОВНАЯ ПРОГРАММА
    //****************************************************************
    int main(int argc, char *argv[])
    {
      int A[COUNT];
      int X = 0;
      
      //Заполнить массив числами
      for (int i = 0; i < COUNT; i++)
        A[i] = i;
    
      //Подсчитать и выбрать простые числа из массива
      for (int i = 0; i < COUNT; i++)
        if (IsPrimeNumber(A[i]))
          {
            X++;
            cout << A[i] << " ";
          };
    
      cout << endl << "Number of Prime numbers = " << X << endl; 
      
      system("PAUSE");
      return EXIT_SUCCESS;
    }

    Как определить простое число

    Как стать программистом 2.0

    Как стать программистом 2.0

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

    Помощь в технических вопросах

    Помощь в технических вопросах

    Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение – ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации.
    Подробнее…

    0 / 0 / 0

    Регистрация: 09.06.2015

    Сообщений: 16

    1

    Найти количество простых чисел в массиве

    30.05.2016, 07:36. Показов 10251. Ответов 1


    Студворк — интернет-сервис помощи студентам

    Дано N мерное массивное число. Есть ли среди массивом простое число? Если есть то нужно вывести число этих элементов.



    0



    Programming

    Эксперт

    94731 / 64177 / 26122

    Регистрация: 12.04.2006

    Сообщений: 116,782

    30.05.2016, 07:36

    Ответы с готовыми решениями:

    Найти количество простых чисел в массиве
    Где ошибка??? не могу понять…
    #include &lt;iostream&gt;
    using namespace std;
    int main()
    {
    int…

    Найти в одномерном массиве, состоящем из N целых чисел, количество простых элементов
    Нужна помощь, буду очень благодарен)

    Общая постановка задания: Используя динамический массив и…

    Найти в массиве количество простых чисел,больших суммы цифр первого числа
    Учусь на 1 курсе,стараюсь,но пока очень туго понимаю С++, по шаблону что-то написать могу, а…

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

    1

    lawr

    385 / 279 / 478

    Регистрация: 09.05.2014

    Сообщений: 769

    30.05.2016, 10:33

    2

    Лучший ответ Сообщение было отмечено Shqrr как решение

    Решение

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    #include <iostream>
    bool Prim (int n){
        for (int d=2; d<=n/2; d++)
            if (n%d==0)
                return false;
        return true;
    }
    int main(){
        int n, p=0;
        std::cin>>n;
        int *A= new int [n];
        for (int i=0; i<n; i++)
        {
            std::cin>>A[i];
            if (Prim(A[i]))
                p++;
        }
        std::cout<<p;
    }



    1



    IT_Exp

    Эксперт

    87844 / 49110 / 22898

    Регистрация: 17.06.2006

    Сообщений: 92,604

    30.05.2016, 10:33

    2

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