С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/120: Рейтинг темы: голосов - 120, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
1

Выдать K-е по счёту простое число

10.06.2020, 18:20. Показов 21760. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите доработать программу . пожалуйста. Простое число
По введённому натуральному числу K, не превосходящему 1000000, выдать K-е по счёту простое число.

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

Во входном файле находится одно натуральное число K.

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

В выходной файл выведите K-е простое число.
Примеры
Ввод
Вывод
3
5
1
2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
 
using namespace std;
 
 
int main()
{
    unsigned long long n=150000000,k,k1=0;
   
    cin >> k;
   long* a = new long[n + 1];
    for (int i = 0; i < n + 1; i++)
        a[i] = i;
    for (int p = 2; p < n+1 ; p++)
    {
        if (a[p] != 0)
        {
           // cout << a[p] << endl;
            for (unsigned long long j = p * p; j < n + 1; j += p)
                a[j] = 0;
        }
    }
 
    for (int i = 2; i < n; i++)
    {
        if (a[i] != 0)
        {
            k1++;
            if (k == k1)
            {
                cout << a[i];
                return 0;
            }
     }
 
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.06.2020, 18:20
Ответы с готовыми решениями:

Вывести N-ое по счету простое число
Вводится целое число N, 0 &lt; N &lt; 105. Вывести N-ое по счету простое число. Пример ввода: 1...

По введенному натуральному числу k, не превосходящему 100 000, выдать k-е по счету простое число
По введенному натуральному числу k, не превосходящему 100 000, выдать k-е по счету простое число....

По данному числу k найдите k-е по счету простое число
По данному числу k найдите k-е по счету простое число.

Найти k по счету простое число (первым простым числом является 2)
Найти k-ое по счету простое число (первым простым числом является 2).

26
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
10.06.2020, 19:53 2
dmitrii2000, ваш код мне не нравится от слова совсем. Так что дорабатывать я его не буду. А все намного проще
C++
1
2
3
4
long count = 0, p;
for(p=2; count <K; p++) 
   if (IsPrim(p))  count++;
cout << p;
Вам осталось только сделать функцию IsPrim, Определяющую, простое ли число. Надеюсь, с этим вы справитесь.

Добавлено через 9 минут
Хотя, я понял, что вы делаете через решето Эратосфена. Да, это будет несколько быстрее. Но решето строится совсем не так. Достаточно использовать для его построения тип данных char. Еще лучше - bool, но я не знаю, насколько эффективно С++ работает с булевыми массивами.
В элементе решета только 2 значения: 0 - число не простое, 1 - простое (можно и наоборот)
Решето можно строить по ходу вычисления простых.
Подумайте. Если будут сложности, постараемся вам помочь.
ЗЫ. И код заключайте в теги языка. Умеете? Могу научить, это несложно.

Добавлено через 5 минут
dmitrii2000, основной цикл примерно такой, как я показал. Только с попутным заполнением решета. А IsPrim будет выглядеть поинтереснее. Так проверять на делимость надо только числа решета.
Есть еще один путь. И он даже интереснее. По ходу дела создавать список простых.
0
0 / 0 / 0
Регистрация: 01.07.2019
Сообщений: 20
10.06.2020, 21:15 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool sieve[15500000];
 
int main()
{
    const long long sieve_size = 15500000;
    int k;
    cin >> k;
    for (int i = 2; i <= sieve_size; i++ )
    {
        if (!sieve[i])
        {
            if ( i*1ll*i <= sieve_size )
                for (int j = i*i; j <= sieve_size; j += i)
                    sieve[j] = true;
        }
    }
 
    vector<int>primes;
    for ( int i = 2; i <= sieve_size; i++ ) if ( sieve[i] == false ) primes.push_back(i);
    cout << primes[k-1] << '\n';
    return 0;
}
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
10.06.2020, 21:32 4
Hikaru666, Выход за границу массива. И незачем выносить решето в глобальную область, задавая размер в двух местах.
0
723 / 683 / 110
Регистрация: 29.05.2015
Сообщений: 4,107
10.06.2020, 22:17 5
Миллионное простое число: 15 485 863. Дальше просто. При запуске программы решето ищет все пр. числа до этого - это доли секунды. А потом перебором находим n-ное число в списке
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
10.06.2020, 22:34 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
vector<int>primes;
for(i=2; primes.size() < K; i++) {
  bool isP = true;
  for(j=0; j< primes.size(); j++) {
    int p = primes[j];
    if (p*p > i) break;
    if (i%p) == 0) {
     isP = false;
     break;
   }
  }
   if (isP) primes.push_back(i);
}
cout << primes[primes.size() - 1);
Добавлено через 3 минуты
В строке 4 пропустил скобочку "{". Но успел поправиться
0
Заклинатель змей
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
11.06.2020, 00:16 7
Hikaru666, а чего не
C++
1
15500000+1
?
0
723 / 683 / 110
Регистрация: 29.05.2015
Сообщений: 4,107
11.06.2020, 09:13 8
Потому что миллионное простое число 15 485 863. 15 500 000 хватает с запасом.
0
0 / 0 / 0
Регистрация: 01.07.2019
Сообщений: 20
11.06.2020, 10:28 9
Не совсем понимаю, где выход за границу?
Цитата Сообщение от nalbe666 Посмотреть сообщение
Выход за границу массива.
Добавлено через 30 секунд
Цитата Сообщение от DobroAlex Посмотреть сообщение
Hikaru666, а чего не
Выше ответили)
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
11.06.2020, 20:50 10
Hikaru666, у вас массив размером 15500000 и sieve_size = 15500000. Далее по коду
Цитата Сообщение от Hikaru666 Посмотреть сообщение
for (int i = 2; i <= sieve_size; i++ )
    {
        if (!sieve[i])
i примет значение 15500000, оператор if полезет проверять sieve[15500000]... а индекс массива у нас должен лежать в диапазоне [0, 15500000).
0
723 / 683 / 110
Регистрация: 29.05.2015
Сообщений: 4,107
11.06.2020, 21:40 11
i никогда не дойдёт до 15500000. Break сработает раньше.
Полностью цикл должен выглядеть примерно так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int N = 1000000;  // будем искать миллионное простое число;
int cx = 0;            // счетчик
int i;
 
for (i = 2; i <= sieve_size; i++ )
    {
        // если sieve[i] = 0 - число простое 
        if (!sieve[i])
        {
            ++cx;
            if(cx == N) break;
        }
     }
 
   // результат в i - простое число 
   // с порядковым номером N
   printf(i);
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
11.06.2020, 21:46 12
alexu_007, речь о сообщении №3. Какой брейк там сработает?
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
12.06.2020, 10:02 13
Небольшая модификация кода из поста 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int>primes;
primes.reserve(K);  // Чтоб не было лишних перераспределений памяти...
for(i=2; primes.size() < K; i++) {
  bool isP = true;
  for(j=0; j< primes.size(); j++) {
    int p = primes[j];
    if (p*p > i) break;
    if (i%p) == 0) {
     isP = false;
     break;
   }
  }
   if (isP) primes.push_back(i);
}
cout << primes[primes.size() - 1);
0
0 / 0 / 0
Регистрация: 01.07.2019
Сообщений: 20
12.06.2020, 10:52 14
Понял, спасибо.
Цитата Сообщение от nalbe666 Посмотреть сообщение
i примет значение 15500000, оператор if полезет проверять sieve[15500000]... а индекс массива у нас должен лежать в диапазоне [0, 15500000).
0
723 / 683 / 110
Регистрация: 29.05.2015
Сообщений: 4,107
12.06.2020, 12:04 15
Цитата Сообщение от Байт Посмотреть сообщение
Небольшая модификация кода из поста 6
Ошибки в строках 8 и 15 - не хватает скобки и скобка не та.
И работает медленно. 10-миллионное число (179424673) нашло за минуту!
С помощью решета Эрастофена задача решается за 1,2 сек:
Миниатюры
Выдать K-е по счёту простое число  
1
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
12.06.2020, 16:36 16
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ошибки в строках 8 и 15 - не хватает скобки и скобка не та.
Спасибо за поправки!
Цитата Сообщение от alexu_007 Посмотреть сообщение
И работает медленно. 1
и за критику спасибо! Это кажется несколько странным, но конечно, требует анализа и понимания. В принципе, все можно сделать и без векторов, на чистом Си. Может быть, вектор тормозит, хотя с чего бы это? В свободную минуту может быть займусь...
0
723 / 683 / 110
Регистрация: 29.05.2015
Сообщений: 4,107
12.06.2020, 19:59 17
Цитата Сообщение от Байт Посмотреть сообщение
Это кажется несколько странным, но конечно, требует анализа и понимания.
Что тут странного? Решето Эрастофена заточено для быстрого получения больших количеств простых чисел. А вы хотите угнаться за ним с помощью алгоритма, где простые числа добываются делением.

Решето "перелопачивает" 180 млн. обычных чисел, и "добывает" из них 10 млн. простых чисел за 0,78 секунды. При этом для сокращения потребления памяти в нём используется QBitArray, что наверняка не способствует быстродействию.

Qt рулит!!!
1
AndryS1
12.06.2020, 21:00
  #18

Не по теме:

Цитата Сообщение от alexu_007 Посмотреть сообщение
Qt рулит!!!
но всё же это раздел не qt, поэтому следует использовать стандартные средства

0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
12.06.2020, 22:40 19
alexu_007, Да, наверное, вы правы.
0
alexu_007
13.06.2020, 01:05     Выдать K-е по счёту простое число
  #20

Не по теме:

Цитата Сообщение от AndryS1 Посмотреть сообщение
но всё же это раздел не qt, поэтому следует использовать стандартные средства
Не могу... душа не лежит к консолькам...

0
13.06.2020, 01:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2020, 01:05
Помогаю со студенческими работами здесь

Дано простое число. Составить функцию,которая будет находить следующее за ним простое число.
дано простое число.составить функцию,которая будет находить следующее за ним простое число.

Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.
Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.

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

Дано простое число. Составить функцию, которая будет находить следующее за ним простое число
Дано простое число. Составить функцию, которая будет находить следующее за ним простое число

Дано простое число. Составить функцию, которая будет находить следующее за ним простое число
Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.

Дано простое число. Составить функцию,которая будет находить следующее за ним простое число
Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала согласования+ стартер fast регистров. Файлы прилагаю. . . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru