Python

Решить задачу 6 написать программу на Питоне

Найдите три натуральных числа, сумма которых равна 520, а произведение содержит максимальное количество нулей. В ответе запишите три числа через пробел в порядке возрастания.
VA
Vasya Ak1Mov
470
Максимально возможное произведение достигается при примерно равных слагаемых (173-174) и равно
 173 * 173 * 174 = 5207646 
В нём - семь цифр. Значит, мы можем получить не больше шести нулей.
Нули получаются в результате произведения двоек и пятёрок из простых множителей.
Набрать большое количество двоек легче, поэтому наша задача - максимизировать количество пятёрок в слагаемых.
Сколько их вообще теоретически можно набрать?
5 в 4-й степени - это 625, за пределами диапазона.
5 в 3-й степени - это 125. Теоретически мы можем набрать 3 раза по 3 пятёрки, если все слагаемые будут кратны 125. Но тогда мы не наберём 9 двоек (мы можем набрать в таком сетапе не более одной).
Одну пятёрку можно обменять на две двойки, иногда - на три:
 8 пятёрок + 3 двойки = 125 + 125 + 200 = 450, три нуля
7 пятёрок + 5 двоек = 125 + 125 + 160 = 410, пять нулей
6 пятёрок + 7 двоек = 125 + 125 + 128 = 378, шесть нулей
Во втором варианте мы не можем добавить даже одну двойку ни в одно слагаемое, т.е. 7 нулей недостижимы. Значит, наша цель - 6 нулей. Семь двоек нам не нужны, хватит шести, т.е. мы перекладываем множители между 125, 125 и 64.

Заметим, что число 520 кратно 8, но некратно 16. Одно из слагаемых будет содержать степень двойки, большую 3. Значит, сумма остальных двух тоже должна делиться на 8. Но 125+125 не делится на ни на какие степени двойки, большие первой. Значит, нужно подменить один из простых множителей в одном из слагаемых. Если, например, заменить 5 на 3, то 25 * 3 + 25 * 5 будет делиться на 3 + 5 = 8, что нам и требуется. Пробуем такой вариант:
 3 * 25 + 125 + 5 * 64 * x = 520
5 * 64 * x = 320
x = 1
Слагаемые: 75 + 125 + 320
Произведение: 3 * 5^6 * 2^6 = 3 млн

Теперь самый главный вопрос - а что же должна делать программа? Например, она может выполнять тупой перебор квадратичной сложности:
 maxz, r = 0, ()
for a in range(1, 520 // 3 + 1):
for b in range(a, (520 - a) // 2 + 1):
c = 520 - a - b
z = str(a * b * c).count('0')
if maxz < z: maxz, r = z, (a, b, c)
print(*r)
Здесь - более 20 тыс итераций.

Или можно пойти по пути комбинирования простых множителей, как описано выше, например, жадным алгоритмом. Кроме 6 пятёрок и 6 двоек, нужно будет пробовать небольшие простые множители (3, 7, может, ещё 11, и всё). Но это оставлю в качестве самостоятельного упражнения.
ЖС
Жако Сериков
54 053
Лучший ответ
max_zeros = 0
result = None
for a in range(1, 174): # максимальное возможное значение для a - корень из (520/3)
for b in range(a, (520-a)//2 + 1): # максимальное возможное значение для b
c = 520 - a - b
zeros = min(a//5 + b//5 + c//5, a//25 + b//25 + c//25, a//125 + b//125 + c//125) # вычисляем количество нулей
if zeros > max_zeros:
max_zeros = zeros
result = (a, b, c)
print(result)
Vasya Ak1Mov ошибка в проге
вичблейд
Almaz 123
Almaz 123
303