4 / 4 / 2
Регистрация: 27.08.2023
Сообщений: 106

Поиск k-го просто числа

19.09.2023, 14:04. Показов 723. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно оптимизировать код, чтобы выполнялся не больше 1 сек
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
int main()
{
    int k, c, j, l = 0;
    cin >> k;
    for (int h=2; k != l; h++){
        c = 0;
        for (int i=1; h >= i; i++){
            if (h%i == 0 ){
                c += 1;
            }
        }
        if (c == 2){
            j = h;
            l ++;
        }
    }
    cout << j;
}
Это код для поиска k-го просто числа
При k = 100000, очень долго считает, как оптимизировать?
c - кол-во делителей числа
i - делитель
h - делимое
j - k-е число
l - Кол-во найденных чисел
k меньше 100000

Добавлено через 1 минуту
Цитата Сообщение от Cookien Посмотреть сообщение
Это код для поиска k-го просто числа
Простого*
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2023, 14:04
Ответы с готовыми решениями:

Создание просто словаря, не выполняется поиск
Пример взят из книги, но работать он не хочет. Проверял цикл for, выдает значение 012.(Не совсем понятно от куда что, ладно 2 цифры но их...

Поиск не работает, почему? Он выдает просто страницу с кодом
&lt;?php $connection = mysqli_connect('localhost','root','',''); $output=''; if(isset($_POST)){ $searchkey= $_POST; ...

Просто числа
Антон Деревенский записал ряд натуральных чисел в порядке возрастания: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 … и...

6
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
19.09.2023, 14:26
Не уверен, что существует математический способ найти к-тое простое число за единицу или за n.

Можно запоминать предыдущие простые числа и делить только на них.

Ченить простенькое наколеночное:
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
#include <iostream>
#include <vector>
#include <limits>
#include <cmath>
 
int main() {
    std::vector<std::size_t> primes {2, 3};
 
    std::size_t i;
    std::cin >> i;
    std::cout << i << std::endl;
 
    if (i < primes.size()) {
        std::cout << primes[i] << std::endl;
        return 0;
    }
 
    auto isPrime = [&primes](std::size_t n)->bool {
        for (std::size_t i = 1, last = primes.size(), root = std::sqrt(n); i < last && primes[i] <= root; ++i) {
            if (n % primes[i] == 0) {
                return false;
            }
        }
        return true;
    };
 
    for (auto j = primes[primes.size() - 1], max = std::numeric_limits<std::size_t>::max();
        primes.size() <= i && j < max; ++++j) {
        if (isPrime(j)) {
            primes.push_back(j);
        }
    }
 
    std::cout << primes[i] << std::endl;
 
    return 0;
}
0
 Аватар для ram876
759 / 456 / 213
Регистрация: 19.12.2016
Сообщений: 1,815
19.09.2023, 14:39
Найти K-е по счёту простое число
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,265
20.09.2023, 08:53
Лучший ответ Сообщение было отмечено Cookien как решение

Решение

Вот быстрый (с моей точки зрения) способ нахождения n-ного простого числа, с помощью ускоренного (без чётных чисел) решета Эрастофена. Правда написано на Qt, но там кутешного только ввод, вывод и замер времени выполнения, сам код чистый си. Максимальное значение n - 100 000 000

C++ (Qt)
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
67
68
69
70
71
72
73
74
// поиск n-ного простого числа
void Widget::press_pbtn_01()
{
    ui->lineEdit_03->clear();
    ui->lineEdit_04->clear();
 
    QString str = ui->lineEdit_01->text();
    str = str.remove(" ");
 
    quint64 n  = str.toULongLong();
    if(n == 0 || n > 100000000) return;
 
    quint64 razm = n * 11;
    quint64 m = sqrt(razm) + 1;
 
    QTime m_time;
 
 
    // с битсетом
    bitset<0x9FFFFFFF> *bbuf = new bitset<0x9FFFFFFF>;
    bbuf->reset();
 
    quint64 k = 0;
 
    ui->lineEdit_04->setText("Please, wait...");
    QApplication::processEvents();
 
 
    // начало отсчёта времени
    quint64 t_begin = m_time.elapsed();
 
    // решето
    for(quint64 i = 0; i < m; i++)
    {
        if(!bbuf->test(i))
        {
            k = (i*2)+3;
            for(quint64 j = k*(i+1)+i; j < razm; j+=k)
            {
                bbuf->set(j,true);
            }
        }
    }
 
    // подсчет результата
    quint64 cy = 1;
 
    if(n == 1) k = 2;
    else
    {
        for(quint64 i = 0; i < razm-1; i++)
        {
            if(!bbuf->test(i))
            {
                cy++;
                if(cy == n)
                {
                    k = i*2 + 3;
                    break;
                }
            }
        }
    }
 
 
    // конец отсчёта времени
    qint64 msecs = m_time.elapsed() - t_begin;
    QTime time(0,0,0,0);
 
    ui->lineEdit_03->setText(fn_SpsToInt(QString::number(k)));
    ui->lineEdit_04->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
 
    delete bbuf;
}
Миниатюры
Поиск k-го просто числа  
1
Нарушитель
10228 / 5658 / 1259
Регистрация: 12.03.2015
Сообщений: 26,227
20.09.2023, 09:36
Цитата Сообщение от alexu_007 Посмотреть сообщение
Вот быстрый (с моей точки зрения) способ нахождения n-ного простого числа, с помощью ускоренного (без чётных чисел) решета Эрастофена.
Согласен. Меня результат устроил.

Вложения
Тип файла: 7z primes.7z (6.96 Мб, 7 просмотров)
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.09.2023, 16:27
0x9FFFFFFF бит это где-то... 320 мегабайт?

Цитата Сообщение от alexu_007 Посмотреть сообщение
C++
1
2
quint64 razm = n * 11;
    quint64 m = sqrt(razm) + 1;
Не пойму, откуда такая оценка?
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,265
20.09.2023, 20:27
Цитата Сообщение от lemegeton Посмотреть сообщение
Не пойму, откуда такая оценка?
Оценка получена опытным путём. Миллионное простое число равно 15 485 863, т.е. более чем в 15 раз больше порядкового номера. Десятимиллионное - 179 424 673 - в 18 раз. Стомиллионное - 2 038 074 743 - более чем в 20 раз. Поэтому для вычисления требуемой длины решета Эрастофена для поиска максимального стомиллионного числа порядковый номер (100 млн.) нужно умножить на 21 - получится с небольшим запасом. Но так как решето Эрастофена модифицированное, и не учитывает чётные числа, длину нужно поделить на 2, ближайшее целое число - 11.

Для меньших порядковых номеров такая длина избыточна, но т.к. и время вычисления существенно падает - с этим можно смириться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2023, 20:27
Помогаю со студенческими работами здесь

Не получается просто вывести числа
Нужно просто вывести числа . Не получается . Вот код: модель: using System; using System.Collections.Generic; using...

Почему не работает программа на проверку просто числа?
#include &quot;stdafx.h&quot; #include&lt;iostream&gt; using namespace std; int main() { int a,i,b; cin&gt;&gt;a; ...

Просто ерунда какая-то, функция просто проверяет мои нервы
Есть функция char OPEN_USER_COMMAND(System::String^ PolzCom) { System::String^ Temp = &quot;PrgBase\\&quot;; System::String^ Temp2...

А как сделать фон белым?(очень просто, просто я не втупляю)
вот код капчи: &lt;?php session_start(); $width = 140; //Ширина изображения $height = 60; //Высота изображения $font_size = 18.5;...

Нужно просто напечатать числа в виде следующей таблицы
А) 0 1 0 2 1 0 3 2 1 0 4 3 2 1 0 Б) 6 5 4 3 2 5 4 3 2 4 3 2 3 2


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru