Во времена, когда люди верили в великую силу чисел, оказалось, что волшебник Пифуман предал все народы и стал помогать Зерону.
Чтобы посетить башни обоих злодеев одновременно, нам следует разделить магию числа, которое защищало нас в дороге.
Чтобы поделить трёхзначное число, нам нужно составить из него минимально и максимально возможные двухзначные числа.
Формат ввода
Одно трёхзначное число.
Формат вывода:
Два защитных числа для каждого отряда, записанные через пробел.
Пример
Ввод
103
Вывод
10 31
Ввод
787
Вывод
77 87
Решение
Эта задача вызывает много затруднений. Часто строятся огромные конструкции для того, чтобы расставить значения по порядку. В то же время задача становится элементарной, если для начала отсортировать значения с помощью приема, который мы уже использовали в задании K. Красота спасёт мир: с помощью функций min() и max() находим минимальное и максимальное значения из трех. Среднее значение вычисляем по формуле сумма всех цифр минус максимальное и минимальное.
Максимальное возможное двузначное число находится очень просто – максимальная цифра умноженная на 10 + средняя по значению цифра.
Минимальное возможное число – находится аналогично максимальному с той лишь разницей, что в качестве десятков будет использоваться минимальная цифра. С ней как раз есть загвоздка – если она равна нулю, то у нас не получится двузначного числа потому, что 05 равно 5. В этом случае достаточно поменять цифры местами и число по-прежнему останется минимально возможным. Если число по-прежнему меньше 10, то стоит взять максимальную цифру на первую позицию.
Посмотреть код
Решение
# Сортировка
num = int(input())
first = num // 100
second = num // 10 % 10
third = num % 10
if first > second:
first, second = second, first
if first > third:
first, third = third, first
if second > third:
second, third = third, second
minimal = first * 10 + second
if minimal < 10:
minimal = second * 10 + 0
if minimal < 10:
minimal = third * 10 + 0
maximal = third * 10 + second
print(minimal, maximal)
Решение
# Поиск среднего через сравнения
num = int(input())
first = num // 100
second = num // 10 % 10
third = num % 10
if max(first, second, third) != first and min(first, second, third) != first:
middle = first
elif max(first, second, third) != second and min(first, second, third) != second: # noqa
middle = second
elif max(first, second, third) != third and min(first, second, third) != third:
middle = third
elif first == second or first == third:
middle = first
elif second == third:
middle = third
if min(first, second, third) != 0:
minimal = min(first, second, third) * 10 + middle
elif middle != 0:
minimal = middle * 10
else:
minimal = max(first, second, third) * 10
maximal = max(first, second, third) * 10 + middle
print(minimal, maximal)
Решение
# Поиск среднего через сумму/разницу
num = int(input())
first = num // 100
second = num // 10 % 10
third = num % 10
middle = first + second + third - min(first, second, third) - max(first, second, third)
if min(first, second, third) != 0:
minimal = min(first, second, third) * 10 + middle
elif middle != 0:
minimal = middle * 10
else:
minimal = max(first, second, third) * 10
maximal = max(first, second, third) * 10 + middle
print(minimal, maximal)
добрый день!
да простят меня опытные программисты, но я хотел предложить свой вариант решения это задачи, который, возможно, не совсем стандартный, но система его зачла как верный
смысл основан на наличии либо отсутствии нулей в исходном трехзначном числе
первое число (естественно, нулем быть не может), второе и третье – может
я раскладываю трехзначное число на комбинации (их понятное и ограниченное количество), затем понимаю, какие комбинации дают НЕ двузначное число и их не учитываю при выводе результата на экран
a = int(input())
a1 = a // 100
a2 = a // 10 % 10
a3 = a % 10
#выводим комбинации чисел
b1 = int(str(a1) + str(a2))
b2 = int(str(a1) + str(a3))
b3 = int(str(a2) + str(a1))
b4 = int(str(a2) + str(a3))
b5 = int(str(a3) + str(a2))
b6 = int(str(a3) + str(a1))
#если второе число это ноль, то выкидываем из расчета минимума комбинацию 3 и 4, если третье число это ноль, то не принимают участие комбинации 5 и 6. в противном случае берем все комбинации
if a2 == 0:
print(min(b1, b2, b5, b6), max(b1, b2, b3, b4, b5, b6))
elif a3 == 0:
print(min(b1, b2, b3, b4), max(b1, b2, b3, b4, b5, b6))
else:
print(min(b1, b2, b3, b4, b5, b6), max(b1, b2, b3, b4, b5, b6))
модель не рассчитана на вариант, когда есть, например, число 100. тогда не получается минимального двузначного числа (это я понял из многочисленных проверок, которые выдавала система при обучении)
Добрый день!
Вам нет необходимости связываться с преобразованием чисел в строки:
b1 = int(str(a1) + str(a2))
можно смело заменить на
b1 = a1 * 10 + a2
При входящем значении 100, минимальное и максимальное двузначное число будет равно 10.
inp = input()
units, dozens, hundreds = int(inp[2]), int(inp[1]), int(inp[0])
sum_1 = units + dozens
sum_2 = hundreds + dozens
if sum_1 > sum_2:
result = str(sum_1) + str(sum_2)
else:
result = str(sum_2) + str(sum_1)
print(result)
Спасибо за решение.
К сожалению, это решение не основано на пройденном материале. В остальном неплохой вариант. Но можно и в одну строку решить.
Тоже предложу свой))
A = int(input())
X = A % 10
Y = (A % 100) // 10
Z = A // 100
Mx = max(X * 10 + Y, X * 10 + Z, Y * 10 + X, Y * 10 + Z, Z * 10 + Y, Z * 10 + X)
Mn = min(X * 10 + Y, X * 10 + Z, Y * 10 + X, Y * 10 + Z, Z * 10 + Y, Z * 10 + X)
if Mn == 0:
Mn = Mx
elif Mn < 10:
Mn = Mn % 10 * 10
print(f'{Mn} {Mx}’)
Ручной перебор всех вариантов плох тем, что в нем очень часто делаются ошибки.
У меня вот такой вариант система приняла
number = int(input())
n1 = int(number / 100)
n2 = int(number % 100 / 10)
n3 = int(number % 100 % 10)
minimum = min(n1, n2, n3)
maximum = max(n1, n2, n3)
average = (n1 + n2 + n3) – (minimum + maximum)
if minimum == 0:
print(str(average) + str(minimum), str(maximum) + str(average))
else:
if average == 0:
print(str(maximum) + str(average), str(maximum) + str(average))
else:
print(str(minimum) + str(average), str(maximum) + str(average))
вполне себе вариант, но на мой взгляд нужно либо использовать f-строки
или поступить еще более грамотно
Я тоже пошел путем поиска цифры 0. Буду рад комментариям
num = int(input())
a = num // 100
b = num // 10 % 10
c = num % 10
max = max(a, b, c)
min = min(a, b, c)
mid = a + b + c – min – max
if min == 0:
min_1 = (a + b + c – max) * 10
max_1 = int(str(max) + str(mid))
else:
min_1 = int(str(min) + str(mid))
max_1 = int(str(max) + str(mid))
print(f'{min_1} {max_1}’)
1) Эта конструкция не учитывает того, что трехзначное число может быть 100, 200 и т. д.
это не проверяется в Яндексе, но тем не менее это вполне легитимный ввод, который поломает вашу программу.
2) вместо
стоит воспользоваться
Вроде проверял, при вводе 200 на выходе:
0 20
Чтобы поделить трёхзначное число, нам нужно составить из него минимально и максимально возможные двухзначные числа.
Ноль не двузначное число.
Согласен, но при вводе 100, 200 и тд. не будет решения, так как будет единственно возможное двузначное число, что противоречит заданию в целом.
назовите минимальное и максимальное значение в последовательности:
1, 1, 1, 1, 1, 1, 1, 1
Теперь понял, максимальное и минимальное число одно и тоже. Благодарю
number = int(input())
n_1 = number // 100
n_2 = number // 10 % 10
n_3 = number % 10
x = min(n_1, n_2, n_3)
y = max(n_1, n_2, n_3)
middle = n_1 + n_2 + n_3 – x – y
end = int(middle) – int(1)
minimal = str(n_1) + str(end)
minimal_1 = str(n_1) + str(middle)
maximal = str(y) + str(middle)
if end == 0:
print(minimal, maximal)
else:
print(minimal_1, maximal)
У меня почему то в яндексе не проходит
Во-первых у вас много ненужных преобразований в целое.
После того, как вы получили в number целое с помощью int(input()) вы после каждой операции получаете целое. Поэтому смело избавляемся от int() везде, кроме input.
Во-вторых: Вы максимальное вычисляете на основании y, в котором хранится максимальное значение из трех. А вот минимальное почему-то вычисляете на основании n_1, в котором хранится не минимальное, а первая цифра числа.
Но и это еще не все У вас есть переменная end, которая по замыслу должна быть на единицу меньше среднего значения.
Эта достаточно искусственная конструкция и портит вам всю логику.
Алгоритм довольно простой . Вы вычислили минимальную, среднюю и максимальную цифры.
Максимальное число всегда – максимальная цифра * 10 + средняя
Минимальное число вычисляется немного сложнее –
в общем случае это минимальная цифра + средняя
но если вдруг минимальная цифра равна нулю, то средняя * 10
если и средняя оказалась равно нулю, то максимальная * 10
PS. для вставки кода с форматированием лучше использовать виджет кода </>, расположенный на нижней строчке окна редактора