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

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

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

Студворк — интернет-сервис помощи студентам
Помогите доработать программу . пожалуйста. Простое число
По введённому натуральному числу 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 Пример вывода: 2 Пример ввода: 5 ...

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

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

26
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.06.2020, 19:53
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
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
Hikaru666, Выход за границу массива. И незачем выносить решето в глобальную область, задавая размер в двух местах.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
10.06.2020, 22:17
Миллионное простое число: 15 485 863. Дальше просто. При запуске программы решето ищет все пр. числа до этого - это доли секунды. А потом перебором находим n-ное число в списке
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.06.2020, 22:34
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
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
11.06.2020, 00:16
Hikaru666, а чего не
C++
1
15500000+1
?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.06.2020, 09:13
Потому что миллионное простое число 15 485 863. 15 500 000 хватает с запасом.
0
0 / 0 / 0
Регистрация: 01.07.2019
Сообщений: 20
11.06.2020, 10:28
Не совсем понимаю, где выход за границу?
Цитата Сообщение от nalbe666 Посмотреть сообщение
Выход за границу массива.
Добавлено через 30 секунд
Цитата Сообщение от DobroAlex Посмотреть сообщение
Hikaru666, а чего не
Выше ответили)
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
11.06.2020, 20:50
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
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
11.06.2020, 21:40
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
alexu_007, речь о сообщении №3. Какой брейк там сработает?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.06.2020, 10:02
Небольшая модификация кода из поста 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
Понял, спасибо.
Цитата Сообщение от nalbe666 Посмотреть сообщение
i примет значение 15500000, оператор if полезет проверять sieve[15500000]... а индекс массива у нас должен лежать в диапазоне [0, 15500000).
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
12.06.2020, 12:04
Цитата Сообщение от Байт Посмотреть сообщение
Небольшая модификация кода из поста 6
Ошибки в строках 8 и 15 - не хватает скобки и скобка не та.
И работает медленно. 10-миллионное число (179424673) нашло за минуту!
С помощью решета Эрастофена задача решается за 1,2 сек:
Миниатюры
Выдать K-е по счёту простое число  
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.06.2020, 16:36
Цитата Сообщение от alexu_007 Посмотреть сообщение
Ошибки в строках 8 и 15 - не хватает скобки и скобка не та.
Спасибо за поправки!
Цитата Сообщение от alexu_007 Посмотреть сообщение
И работает медленно. 1
и за критику спасибо! Это кажется несколько странным, но конечно, требует анализа и понимания. В принципе, все можно сделать и без векторов, на чистом Си. Может быть, вектор тормозит, хотя с чего бы это? В свободную минуту может быть займусь...
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
12.06.2020, 19:59
Цитата Сообщение от Байт Посмотреть сообщение
Это кажется несколько странным, но конечно, требует анализа и понимания.
Что тут странного? Решето Эрастофена заточено для быстрого получения больших количеств простых чисел. А вы хотите угнаться за ним с помощью алгоритма, где простые числа добываются делением.

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

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

Не по теме:

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

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.06.2020, 22:40
alexu_007, Да, наверное, вы правы.
0
13.06.2020, 01:05

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.06.2020, 01:05

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru