Как уменьшить время работы программы?
Выведите на первой строке число от 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;
}
C/C++
Как уменьшить время работы программы? C++
твой алгоритм имеет квадратичное время работы, т. к. поиск числа делителей выполняется за линейное время
тривиальный алгоритм поиска делителей n может перебирать числа только до sqrt(n), а не до n/2, тогда любой делитель d в диапазоне [1; sqrt(n)] будет иметь парный делитель n / d, и мы будем добавлять к ответу сразу 2, а не 1 (кроме случая, когда n = d^2)
и да, вынеси поиск числа делителей в отдельную функцию
тривиальный алгоритм поиска делителей n может перебирать числа только до sqrt(n), а не до n/2, тогда любой делитель d в диапазоне [1; sqrt(n)] будет иметь парный делитель n / d, и мы будем добавлять к ответу сразу 2, а не 1 (кроме случая, когда n = d^2)
и да, вынеси поиск числа делителей в отдельную функцию
Кузя Я
Здравствуйте, спасибо за ответ, можете пожалуйста исправить нужную строчку (и) в коде, я суть понял, но почему-то программа начала выдавать половину правильных ответов, буду очень благодарен!
<от 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++; // одна строчка вместо четырех
// не забывайте хотя бы делать краткие комментарии к коду,
// тем более когда его будут читать другие программисты
вот определите это число как
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++; // одна строчка вместо четырех
// не забывайте хотя бы делать краткие комментарии к коду,
// тем более когда его будут читать другие программисты
Leon *****
совет про фигурные скобки весьма спорный
это сейчас там один оператор, а если понадобится второй добавить?
придётся доставлять ручками фигурные скобки, а ещё можно (с похмелья, например) вообще забыть их добавить и потом искать багу много минут
да и диффы куда красивее получаются
обычная практика в индустрии - это как раз всегда ставить фигурные скобки, даже если оператор один
пример - google c++ style guide
это сейчас там один оператор, а если понадобится второй добавить?
придётся доставлять ручками фигурные скобки, а ещё можно (с похмелья, например) вообще забыть их добавить и потом искать багу много минут
да и диффы куда красивее получаются
обычная практика в индустрии - это как раз всегда ставить фигурные скобки, даже если оператор один
пример - google c++ style guide
циклиться до sqrt(n), а не до n/2
если i является делителем, то n/i тоже делитель
если i является делителем, то n/i тоже делитель
Похожие вопросы
- C++. Есть ли функция для завершения работы программы (аналог goto в самый конец программы)?
- Составить программу c++ срочно пожалуйста
- Остановка программы c++
- Составить программу C++, с помощью switch/case
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++, динамическое программирование)?
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++)?
- Написание программы C++ Массивы
- Написать программу. C++
- Помогите написать программу C++
- Помогите, пожалуйста, написать программу C++!