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

Найти K-е по счёту простое число

11.07.2021, 16:30. Показов 11212. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Простое число
По введённому натуральному числу 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
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
 
int main() {
    int n;
 
 
    std::cin >> n; // считываем номер простого числа, которое нужно найти
 
    int size = n; // число элементов для массива чисел для просеивания
    int* primes = new int[n]; // массив простых чисел
    int* numbers = new int[size]; // массив для чисел
 
    for (int i = 0; i < size; i++)
        numbers[i] = i; // заполняем массив (число равно индексу элемента)
 
    primes[0] = 2; // первое простое число - 2
    int i = 0; // индекс текущего простого числа
 
    while (i < n) {
        int p = primes[i++]; // запоминаем текущее простое число
 
        for (int j = p * 2; j < size; j += p)
            numbers[j] = 0; // обнуляем все кратные ему числа в массиве
 
        while (numbers[p + 1] == 0)
            p++; // ищем следующее ненулевое число
 
        if (p + 1 >= size) { // если выйдем за границы, расширяем массив
            int* tmp = new int[size * 2];
 
            for (int k = 0; k < size; k++)
                tmp[k] = numbers[k];
 
            delete[] numbers;
 
            size *= 2;
            numbers = tmp;
 
            for (int j = size / 2; j < size; j++)
                numbers[j] = j; // заполняем новую часть массива числами
 
            i = 0; // возвращаемся к начальной стадии просеивания
        }
        else
            primes[i] = p + 1; // запоминаем новое простое число
    }
 
    std::cout << primes[n - 1] << std::endl;
 
    delete[] numbers;
    delete[] primes;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2021, 16:30
Ответы с готовыми решениями:

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

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

Дано простое число N. Найти следующие простое число используя do while
простая задача с использованием do while на с++

37
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
18.02.2023, 19:36
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
Ради одноразового нахождения n-го простого числа построение решета кажется сомнительным подходом.
Скорость. Сможете быстрее - пожалуйста:
Миниатюры
Найти K-е по счёту простое число  
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
18.02.2023, 19:40
Цитата Сообщение от Royal_X Посмотреть сообщение
Либо нужно задуматься над оптимизацией алгоритма, учитывая, что для нахождения n-го простого числа существует аппроксимативная формула:
Если существует формула нахождения n-го простого числа без вычисления предыдущих - предоставьте нам её пжалста.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
18.02.2023, 21:14
Цитата Сообщение от alexu_007
Сможете быстрее - пожалуйста:
Да хоть взять этот код и его распараллелить, то получим ещё быстрый код.
Смогу быстрее? Да, конечно, я могу быстро найти в инете ещё лучший код, вот только нет желания тратить на это свое время. Весь инет полон такими кодами. Вы ведь не станете рассказывать, что ваш код это уникальное авторское творение? Что-то я не слышал о решете alexu_007. Вот когда придумаете свое решето и опубликуете в arXiv, то тогда бросьте мне такой вызов)
Цитата Сообщение от alexu_007
Если существует формула нахождения n-го простого числа без вычисления предыдущих - предоставьте нам её пжалста
Я же вроде уже написал, что существует такая формула и она аппроксимативная. Разумеется, что использовать эту формулу именно в таком виде, как она есть, в нашем случае неразумно, т.к. формула точна при n → ∞. Но если поработать над формулой, учитывая, что у нас n < 1000000, то можно вывести другую аппроксимативную формулу, благодаря которой можно будет вычислить n-е простое число без вычисления предыдущих.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
18.02.2023, 21:53
Пример того, как выводят аппроксимативную формулу:
1011.1667.pdf
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
19.02.2023, 10:34
Цитата Сообщение от Royal_X Посмотреть сообщение
Да, конечно, я могу быстро найти в инете ещё лучший код, вот только нет желания тратить на это свое время. Весь инет полон такими кодами.
Ну если "весь инет полон такими кодами" - то и найти один такой много времени не займёт?

Добавлено через 32 минуты
Ну вот ещё, может кому понадобится? Простые числа по порядковому счёту, 1-е, 10-е, 100-е и т.д.:

100 - 2
101 - 29
102 - 541
103 - 7 919
104 - 104 729
105 - 1 279 709
106 - 15 485 863
107 - 179 424 673
108 - 2 038 074 743
2*108 - 4 222 234 741

последнее простое, влезающее в 32 бита:
203280221- 4 294 967 291
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
21.02.2023, 16:23
alexu_007, не мог бы ты скинуть мне экзешник твоей программы? Хочу посмотреть на время выполнения на моем устройстве.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
21.02.2023, 18:53
Могу быстро скинуть ехе-шник, который рассчитывает одно значение, например для 106.

Для возможности вводить разные значения нужно переделывать программу, т.к. я вносил изменения в сам код, перекомпилировал, и получал разные результаты. Дело в том, что нужно менять не только желаемый порядковый номер простого числа, но и требуемую для этого длину решета Эрастофена. Т.к. излишняя длина приведёт к бесполезным затратам времени - лишние простые числа вычислятся, но не будут использованы. А зависимость длины решета Эрастофена от порядкового номера простого числа нелинейная, что видно по приведённым мной значениям.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
21.02.2023, 19:02
alexu_007, на одно значение подойдет, только надо, чтобы показывала время выполнения, как на том скриншоте и саму длину массива.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
21.02.2023, 22:21
Ексешник запускай прямо в папке с библиотеками (это библиотеки Qt). Размер решета Эрастофена должен быть больше предполагаемого простого числа, как на картинке. Но не намного. Чем больше превышение, тем медленнее будет работать. Если решето сделать меньше требуемого - выдаст неверный результат.

Максимальный размер решета: 4 294 967 295 (0xFFFFFFFF).

Понимаю, что можно один раз вычислить решето, и затем искать простые числа. Но эта программа не о том, а для измерения времени работы "решето+поиск". Поэтому решето каждый раз вычисляется по-новой.
Миниатюры
Найти K-е по счёту простое число  
Вложения
Тип файла: zip Erastofen2.zip (5.08 Мб, 20 просмотров)
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
21.02.2023, 22:23
И отпишись о результате, пожалуйста.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
21.02.2023, 23:37
alexu_007, 16 млн решето и 1 млн на моем ноуте 94 мс. , а 4,3 млрд решето и 200 млн прибл. 45 сек. Но мой ноут старый, поэтому можно сказать, что не сильно отличается от твоих значений.
Программа однопоточная?
0
2 / 2 / 0
Регистрация: 15.10.2014
Сообщений: 99
22.02.2023, 00:33
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
#include <iostream>
#include <vector>
 
using namespace std;
 
bool is_prime(int n) {
    if (n < 2) {
        return false;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}
 
int main() {
    int k;
    cin >> k;
 
    vector<int> primes;
    primes.push_back(2);
    int n = 3;
    while (primes.size() < k) {
        if (is_prime(n)) {
            primes.push_back(n);
        }
        n += 2;
    }
 
    cout << primes[k-1] << endl;
 
    return 0;
}
это решит твою ошибку
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
22.02.2023, 01:01
alexu_007, можешь проверить мою у себя на тех же числах? Это консольное приложение, лень делать десктоп. Да и это сделано, чтобы проверить скорость)
Я вот делаю другую на JS, там у меня есть графический интерфейс. При вводе порядкового номера программа на базе приближенных формул с логарифмами показывает диапазон для выбора размера решета, чтобы точно попасть.
Вложения
Тип файла: zip Eratosthenes.zip (317.8 Кб, 17 просмотров)
1
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
22.02.2023, 06:47
Моя программа однопоточная.
Твоя программа (консольная) работает в 2 раза быстрее моей.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
22.02.2023, 13:42
alexu_007, ясно, у меня тоже однопоточная, но думаю, что если распараллелить, то можно ускорить работу.

Я вот уже как пару дней изучаю JavaScript. Он хоть по возможностям с языком С++ не сравнится, но однако имеет некоторые преимущества, например, написал и код и интерфейс в любом текстовом редакторе, а потом запустил на любой платформе, где есть браузер. Отладка и профилирование тоже в браузере)

Если интересно, то во вложении программа на JS, о которой я говорил. Во время ввода размера решета программа показывает приблизительное количество простых чисел для этого размера. И наоборот, во время ввода порядкового номера простого числа она показывает приблизительный размер решета.
Вложения
Тип файла: zip primes.zip (2.5 Кб, 9 просмотров)
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
22.02.2023, 13:45
Но, разумеется, там слишком большие числа как в С++ не посчитаешь. Хотя, 1 млн -е простое число считает быстро.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
23.02.2023, 08:05
Цитата Сообщение от Royal_X Посмотреть сообщение
alexu_007, ясно, у меня тоже однопоточная, но думаю, что если распараллелить, то можно ускорить работу.
Ну выложи исходничек, посмотреть, за счёт чего она мою в 2 раза обставляет.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6334 / 3067 / 1054
Регистрация: 01.06.2021
Сообщений: 11,727
23.02.2023, 13:27
alexu_007,

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <stdint.h>
#include <chrono>
 
constexpr int64_t L1_CPU_CACHE = 32768; // 32 KiB = 32768 B
 
std::vector<int64_t> sieveOfEratosthenes(int64_t x)
{
    std::vector<int64_t> r;
    r.push_back(2);
    int64_t w = static_cast<int64_t>(std::sqrt(x));
    int64_t a = std::max(w, L1_CPU_CACHE);
    int64_t i = 3, n = i, s = n;
    std::vector<char> v(a);
    std::vector<char> q(w + 1, true);
    std::vector<int64_t> p;
    std::vector<int64_t> m;
    for (int64_t l = 0; l <= x; l += a)
    {
        std::fill(v.begin(), v.end(), true);
        int64_t h = l + a - 1;
        h = std::min(h, x);
        for (; i * i <= h; i += 2)
            if (q[i])
                for (int64_t j = i * i; j <= w; j += i)
                    q[j] = false;
        for (; s * s <= h; s += 2)
        {
            if (q[s])
            {
                p.push_back(s);
                m.push_back(s * s - l);
            }
        }
        for (std::size_t i = 0; i < p.size(); i++)
        {
            int64_t j = m[i];
            for (int64_t k = p[i] * 2; j < a; j += k)
            v[j] = false;
            m[i] = j - a;
        }
        for (; n <= h; n += 2)
            if (v[n - l])
                r.push_back(n);
    }
    return r;
}
 
int main()
{
    int64_t n, x;
    std::cout << "n = "; std::cin >> n;
    std::cout << "x = "; std::cin >> x;
    auto start = std::chrono::high_resolution_clock::now();
    std::vector<int64_t> s = sieveOfEratosthenes(x);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> diff = end - start;
    std::cout << "Prime[" << n << "] = " << s[n-1] << '\n';
    std::cout << "PrimePI[" << x << "] = " << s.size() << '\n';
    std::cout << diff.count() << " s\n";
    std::system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2023, 13:27

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

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

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

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

Дано простое число. Найти следующее за ним простое число
Дано простое число. Составить программу,которая будет находить следующее за ним простое число.(напр. для 11-13,а для 23-29). Если исходное...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru