N. Властелин Чисел: Две Башни

Во времена, когда люди верили в великую силу чисел, оказалось, что волшебник Пифуман предал все народы и стал помогать Зерону.

Чтобы посетить башни обоих злодеев одновременно, нам следует разделить магию числа, которое защищало нас в дороге.

Чтобы поделить трёхзначное число, нам нужно составить из него минимально и максимально возможные двухзначные числа.

Формат ввода

Одно трёхзначное число.

Формат вывода:

Два защитных числа для каждого отряда, записанные через пробел.

Пример

Ввод

103

Вывод

10 31

Ввод

787

Вывод

77 87

Решение

Эта задача вызывает много затруднений. Часто строятся огромные конструкции для того, чтобы расставить значения по порядку. В то же время задача становится элементарной, если для начала отсортировать значения с помощью приема, который мы уже использовали в задании K. Красота спасёт мир: с помощью функций min() и max() находим минимальное и максимальное значения из трех. Среднее значение вычисляем по формуле сумма всех цифр минус максимальное и минимальное.

Максимальное возможное двузначное число находится очень просто – максимальная цифра умноженная на 10 + средняя по значению цифра.

Минимальное возможное число – находится аналогично максимальному с той лишь разницей, что в качестве десятков будет использоваться минимальная цифра. С ней как раз есть загвоздка – если она равна нулю, то у нас не получится двузначного числа потому, что 05 равно 5. В этом случае достаточно поменять цифры местами и число по-прежнему останется минимально возможным. Если число по-прежнему меньше 10, то стоит взять максимальную цифру на первую позицию.

Посмотреть код

Решение

Python
# Сортировка

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)

Решение

Python
# Поиск среднего через сравнения

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)

Решение

Python
# Поиск среднего через сумму/разницу

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)
Подписаться
Уведомить о
guest
17 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Алексей
Алексей
26.12.2023 18:50

добрый день!
да простят меня опытные программисты, но я хотел предложить свой вариант решения это задачи, который, возможно, не совсем стандартный, но система его зачла как верный

смысл основан на наличии либо отсутствии нулей в исходном трехзначном числе
первое число (естественно, нулем быть не может), второе и третье – может

я раскладываю трехзначное число на комбинации (их понятное и ограниченное количество), затем понимаю, какие комбинации дают НЕ двузначное число и их не учитываю при выводе результата на экран

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. тогда не получается минимального двузначного числа (это я понял из многочисленных проверок, которые выдавала система при обучении)

Дмитрий
23.01.2024 16:44

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)

Вероника
Вероника
20.05.2024 17:08

Тоже предложу свой))

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}’)

Павел
Павел
05.07.2024 15:18

У меня вот такой вариант система приняла

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))

Никита
Никита
Ответить на  Павел
15.08.2024 21:00

Я тоже пошел путем поиска цифры 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}’)

Никита
Никита
Ответить на  Сергей Клочко
17.08.2024 12:47

Вроде проверял, при вводе 200 на выходе:

0 20

Никита
Никита
Ответить на  Сергей Клочко
17.08.2024 13:01

Согласен, но при вводе 100, 200 и тд. не будет решения, так как будет единственно возможное двузначное число, что противоречит заданию в целом.

Никита
Никита
Ответить на  Сергей Клочко
17.08.2024 13:12

Теперь понял, максимальное и минимальное число одно и тоже. Благодарю

Всеволод
Всеволод
12.10.2024 11:10

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)
У меня почему то в яндексе не проходит