Задача
На уроці математики Байтик навчився множити, і почав застосовувати цю операцію з різними числами. Наприклад, розкладав число на цифри і знаходив добуток цифр. І тут він задумався, який найбільший добуток цифр серед натуральних чисел, що не перевищує [latex]N[/latex]. Допоможіть розв’язати задачу.
Вхідні дані
Одне число [latex]N(1\leqslant N\leqslant 2\times 10^{9})[/latex].
Вихідні дані
Максимальний добуток цифр серед чисел, що не перевищують [latex]N[/latex].
Тести
Вхідні дані | Вихідні дані |
---|---|
57 | 36 |
1000 | 729 |
7999 | 5103 |
28994 | 10368 |
4876 | 2268 |
Код програми
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <iostream> using namespace std; int multiplication(int x) { int mul = 1; while(x != 0) { mul *= x % 10; x /= 10; } return mul; } int main() { int n; cin >> n; int maxmul = multiplication(n); int copy = n; int i = 10; while(n != 0) { int temporary_number = (copy / (i / 10)) % 10; int left = copy / i; int right = copy % (i / 10); if(temporary_number != 9) { temporary_number = 9; copy = ((left - 1) * 10 + temporary_number) * (i / 10) + right; } n /= 10; i *= 10; int mul = multiplication(copy); if(maxmul < mul) maxmul = mul; } cout << maxmul; } |
Алгоритм
Складність задачі полягає в обмеженості у часі.
- Знайдемо добуток цифр заданого числа.
- Змінемо останню цифру на [latex]9[/latex] та віднімемо [latex]1[/latex] від попереднього розряду. Визначаємо поточний добуток цифр отриманого числа. Повторюємо цю операцію з наступними розрядами числа.
- Порівнюємо поточний добуток з максимальним.
Приклад:
Приклад розкладу числа на різних етапах алгоритму:
Посилання
Задача на e-olymp
Зарахований розв’язок
Код на ideone
Код будет легче читаться, если произведение цифр целого числа будет вычислять отдельная функция.
Вы ищите максимум среди значений, которые последовательно вычисляете на основе исходного числа n. Зачем Вам для поиска максимума хранить все эти значения?! Просто сравнивайте очередное произведение с максимумом и двигайтесь дальше. Без массивов.
Постарайтесь сделать код лаконичнее, 39 строк это многовато для такой задачи.
И, пожалуйста, на этот раз полностью самостоятельно. уж Вам-то для этой задачи помощь точно не нужна.
Благодарю Вас, я переделаю.
Хорошо.
Но на мой взгляд объяснить и запрограммировать можно лаконичнее:
Максимум произведения достигается либо на исходном числе, либо на числе меньшем на 1. Либо заканчивающемся на одну и более 9-ток. При этом та часть к которой дописываете девятки тоже уменьшается на 1.
Нет, кажется простого объяснения у меня тоже не получилось 🙂