#python #алгоритм #python_3x #математика
Есть задачка: 2520 - это наименьшее число, которое можно разделить на каждое из чисел от 1 до 10 без остатка. Найдите такое наименьшее положительное число, которое делится на все числа от 1 до 20? Задачку эту я решил, написав плохо оптимизированный алгоритм полного перебора вариантов. calculate = True max_number = 20 min_number = 1 current_divisible = 2520 count = 0 while calculate: for i in range(2, max_number + 1): if current_divisible % i == 0: count += 1 min_number = current_divisible else: count = 0 break current_divisible += 1 if count == max_number: calculate = False print(min_number) # 232792560 Ответом этой задачки является число 232792560, но мой алгоритм считает это очень долго. Около 15 минут. Никак не могу понять, как лучше оптимизировать данный код.
Ответы
Ответ 1
Вообще-то говоря, вам надо просто искать наименьшее общее кратное для всех чисел от 1 до 20 :) Элементарно, никакого перебора, мгновенно. Я могу набросать код на C или C++, Python не знаю. Вот код - алгоритм Евклида для НОД, затем НОК... long gcd(long m, long n) { while(m && n) if (m < n) n %= m; else m %= n; return (m == 0L) ? n : m; } long lcm(long m, long n) { return (m/gcd(m,n))*n; } int main(int argc, const char * argv[]) { long Res = 1; for(int i = 2; i <= 20; ++i) { Res = lcm(Res,i); } cout << Res << endl; }
Комментариев нет:
Отправить комментарий