@vseminelybim
Python ботоводство и прочая грязюка

Как можно ускорить алгоритм?

Собственно говоря, есть вот такой банальный и простой алгоритм, который вроде как решает задачу, но не умещается по времени. Есть ли варианты как-то ускорить это безобразие? И скрин задачки для понимания что вообще происходит. Буду очень благодарен, если подкинете вариантов:)

#include <iostream>

using namespace std;

int main() {

    long int K;
    long int L = 0;

    cin >> K;

    for (long int i = 2; i < K; i++)
    {
        if (K % (i + 1) == 0) {
            L = i;
            break;
        }
    }
    cout << L;

    return 0;
}


6293d76f05341519796195.png
  • Вопрос задан
  • 204 просмотра
Пригласить эксперта
Ответы на вопрос 3
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вы правильно поняли, что вам надо найти минимальный делитель числа K.

Проблема в том, что если число K простое - то вы будете проходиться до него. Есть трюк - достаточно проверять только числа до корня из K. Ведь если у числа есть какой-то минимальный собственный (меньше него самого) делитель, то он точно меньше корня (потому что делителей как минимум два, и если минимальный из них больше корня, то их произведение - больше самого числа).

Если вы не нашли делителя до корня, то число простое и в качестве делитеял можно брать все K и тогда ответ будет K-1.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Какое-то время я посвятил играм с простыми числами. В студенчестве еще.
Вот тут не надо каждый раз прибавлять единичку.
if (K % (i + 1) == 0) {
Ее просто надо учесть в условиях цикла.
if (K % i == 0) {
Далее. Если нужно найти первый попавшийся делитель - то не надо перебирать все числа. Достаточно только 2 и все нечетные. Или даже лучше задать хард-кодом таблицу простых чисел до 2^16. Это как раз будет половина разрядной сетки int32.
int primes[] = { 2,3,5,7,11,13,17...... 65521 }
Это даст хорошее ускорение для поиска. Хотя время загрузки executable может увеличится. Кстати у меня много вопросов к бенчмаркам где стоит запредельно короткое время инициализации (0.25 s). Здесь - практически невозможно вычленить где время занимает алгоритм а где - просто запуск процесса операционки. Обычно когда меряют что-то подобное - меряют длительные процессы хотя-бы порядка минут но никак не секунд.
Ответ написан
@vanyamba-electronics
Первый игрок назначает например число три (K). Второй назначает число 2 (L=K-1), и всегда забирает последнюю пуговицу. Что-то явно не то с условиями задачи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы