C/C++

Как уменьшить время работы программы? C++

Как уменьшить время работы программы?
Выведите на первой строке число от 1 до n, включительно, которое имеет максимальное число делителей. На второй строке выведите число его делителей. Если есть несколько чисел от 1 до n с максимальным числом делителей, выведите любое из них.
Я для трех чисел написал исключение, но замечу что и без него все равно превышено ограничение по времени, n меньше либо равно 100000 (10^5).
Беда именно с большими числами.

#include
using namespace std;

int main()
{
int n, i, maxi = 0, a=0, k=0, j;
std::cin >> n;
if (n > 3)
{
for (i = 1; i <= n; i++)
{
k = 2;
for (j = 2; j <= i / 2; j++)
{
if (i % j == 0)
{
k++;
}
}

if (k > maxi)
{
a = i;
maxi = k;
}

}
std::cout << a << endl << maxi;
}
else if (n == 1)
{
std::cout << 1 << endl << 1;
}
else if (n == 2 or n==3)
{
std::cout << 2 << endl << 2;
}

return 0;

}
Кузя Я
Кузя Я
141
твой алгоритм имеет квадратичное время работы, т. к. поиск числа делителей выполняется за линейное время

тривиальный алгоритм поиска делителей n может перебирать числа только до sqrt(n), а не до n/2, тогда любой делитель d в диапазоне [1; sqrt(n)] будет иметь парный делитель n / d, и мы будем добавлять к ответу сразу 2, а не 1 (кроме случая, когда n = d^2)

и да, вынеси поиск числа делителей в отдельную функцию
Sam Sam
Sam Sam
36 956
Лучший ответ
Кузя Я Здравствуйте, спасибо за ответ, можете пожалуйста исправить нужную строчку (и) в коде, я суть понял, но почему-то программа начала выдавать половину правильных ответов, буду очень благодарен!
<от 1 до n, включительно, >
вот определите это число как
int maxNumber = 12345....;

и сначала тестируйте алгоритм на нем (без ввода cin >> maxNumber;)
и ищите от большего к меньшему
for ( int i = maxNumber; i > 1; i--)

возможно не нужно перебирать все числа (решение в лоб),
а использовать признаки делимости чисел.

Ответы режут форматирование, поэтому свой код лучше
копировать сюда https://pastebin.com
в Ответы давать только ссылку на код.

Избегайте лишних фигурных скобок, это только ухудшает понимание.
if (i % j == 0)
{
k++;
}
Здесь один оператор всего, лучше записать так:
if (i % j == 0) k++; // одна строчка вместо четырех

// не забывайте хотя бы делать краткие комментарии к коду,
// тем более когда его будут читать другие программисты
Кавказ Гянджа в ссылке готовый код. не тестировал, не вникал.
https://pastebin.com/K5iQdQAA
Leon ***** совет про фигурные скобки весьма спорный
это сейчас там один оператор, а если понадобится второй добавить?
придётся доставлять ручками фигурные скобки, а ещё можно (с похмелья, например) вообще забыть их добавить и потом искать багу много минут
да и диффы куда красивее получаются
обычная практика в индустрии - это как раз всегда ставить фигурные скобки, даже если оператор один
пример - google c++ style guide
циклиться до sqrt(n), а не до n/2
если i является делителем, то n/i тоже делитель
Prizrak
Prizrak
6 630