5.04 Прочие прототипы
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Алгоритм получает на вход натуральное число и строит по нему новое число
следующим образом:
- Если исходное число кратно
, оно делится на
, иначе из него вычитается
.
- Если полученное на предыдущем шаге число кратно
, оно делится на
, иначе из него вычитается
.
- Если полученное на предыдущем шаге число кратно
, оно делится на
, иначе из него вычитается
.
- Число, полученное на шаге
, считается результатом работы алгоритма.
Сколько существует различных натуральных чисел , при обработке которых получится
?
Решение программой:
В этой задаче нам необходимо определить, сколько различных натуральных чисел N при обработке алгоритмом дают результат R = 2. Для этого мы сначала «переводим» пошаговое описание алгоритма с естественного языка на язык Python. Мы начинаем с цикла for, перебирающего все числа от 2 до некоторого верхнего предела (например, 100000) — это гарантирует, что мы рассмотрим все возможные варианты N, больше 1. Внутри цикла текущее число сохраняем в переменную s, с которой будем работать. На первом шаге проверяем, делится ли число на 3, используя оператор s
Далее аналогично обрабатываем проверку делимости на 5. Если текущее число кратно 5, делим его на 5 (s //= 5), иначе уменьшаем на 1 (s -= 1). После этого проверяем делимость на 11: если число делится на 11, выполняем деление на 11 (s //= 11), иначе снова вычитаем 1 (s -= 1). После этих трёх последовательных шагов мы получаем число, которое алгоритм считает результатом работы, и сохраняем его в переменной s. На последнем этапе проверяем, равно ли это число 2 (if s == 2). Если условие выполняется, мы увеличиваем счётчик ans на 1, чтобы учитывать найденное число N. После завершения перебора выводим значение счётчика, что и даст количество всех натуральных чисел N, для которых алгоритм даёт R = 2.
# Инициализация счётчика найденных чисел N ans = 0 # Перебор всех натуральных чисел N, начиная с 2 (так как N > 1) for i in range(2, 100000): # Копируем текущее число в переменную s для обработки s = i # Шаг 1: проверяем, делится ли s на 3 if s % 3 == 0: # Если делится, делим s на 3 s //= 3 else: # Если не делится, вычитаем 1 s -= 1 # Шаг 2: проверяем, делится ли текущее s на 5 if s % 5 == 0: # Если делится, делим на 5 s //= 5 else: # Если не делится, вычитаем 1 s -= 1 # Шаг 3: проверяем, делится ли текущее s на 11 if s % 11 == 0: # Если делится, делим на 11 s //= 11 else: # Если не делится, вычитаем 1 s -= 1 # Проверка: если полученное число равно 2, увеличиваем счётчик if s == 2: ans += 1 # Выводим общее количество чисел N, для которых алгоритм даёт R = 2 print(ans)
Ошибка.
Попробуйте повторить позже
Автомат получает на вход трехзначное число. По этому числу строится новое число по следующим правилам.
1. Из цифр, образующих десятичную запись N, строится наибольшее и наименьшее возможные двузначные числа
(числа не могут начинаться с нуля)
2. На экран выводится разность полученных двузначных чисел.
Чему равно количество чисел N в отрезке [300,700], в результате обработки которых на экране появится число 10?
В этой задаче нам нужно для каждого трёхзначного числа из диапазона [300, 700] рассмотреть все возможные пары цифр, из которых можно составить двузначные числа, не начиная их с нуля. Для этого мы сначала преобразуем число N в строку, чтобы получить доступ к каждой отдельной цифре. Далее мы перебираем все пары индексов цифр (i, j), где i < j, чтобы сформировать двузначные числа из двух выбранных цифр в обеих возможных порядках: s[i] + s[j] и s[j] + s[i]. Для каждой такой пары проверяем, что первая цифра не равна ’0’ — это условие задачи, запрещающее начинать число с нуля. Из всех возможных двузначных чисел, составленных из цифр числа N, выбираем наибольшее и наименьшее. Затем вычисляем их разность и проверяем, равна ли она 10. Если равна — увеличиваем счётчик. В конце выводим общее количество таких чисел N, для которых разность полученных двузначных чисел равна 10.
c = 0 # Счётчик чисел, удовлетворяющих условию for n in range(300, 701): # Перебор всех трёхзначных чисел от 300 до 700 включительно s = str(n) # Преобразуем число в строку для удобного доступа к цифрам mn = 10**10 # Инициализируем минимум очень большим числом для последующего поиска минимального двузначного числа mx = -10**9 # Инициализируем максимум очень маленьким числом для последующего поиска максимального двузначного числа for i in range(len(s)): # Перебираем первую цифру пары for j in range(i+1, len(s)): # Перебираем вторую цифру пары, чтобы избежать повторений и порядок соблюсти if s[i] != ’0’: # Проверяем, что первая цифра двузначного числа не равна нулю (условие задачи) val = int(s[i] + s[j]) # Формируем двузначное число из цифр s[i] и s[j] mx = max(val, mx) # Обновляем максимум, если текущее число больше mn = min(val, mn) # Обновляем минимум, если текущее число меньше if s[j] != ’0’: # Аналогично проверяем вторую возможную пару с другой первой цифрой val = int(s[j] + s[i]) # Формируем двузначное число из цифр s[j] и s[i] mx = max(val, mx) # Обновляем максимум mn = min(val, mn) # Обновляем минимум if mx - mn == 10: # Проверяем, равна ли разность максимума и минимума десяти c += 1 # Если да, увеличиваем счётчик подходящих чисел print(c) # Выводим количество таких чисел