Информатика, вопрос задал divoaliali , 1 год назад

ОСНОВЫ ПРОГРАММИРОВАНИЯ PYTHON 45 БАЛЛОВ 1) Определить количество принадлежащих отрезку [345678; 456789] натуральных чисел, которые делятся без остатка на сумму своих цифр, а также наименьшее из таких чисел. 2) Назовем натуральное число подходящим, если ровно два из его делителей входят в список (11, 13, 17, 19). Определить количество подходящих чисел, принадлежащих отрезку [11000; 22000], а также наименьшее из таких чисел. 3) Маска числа - это последовательность цифр, в которой могут встречаться специальные символы "?" и "*". Символ "?" означает ровно одну произвольную цифру, символ "*" означает произвольную(в том числе пустую) последовательность цифр. ПРИМЕР: Маске 123*4?5 соответствуют числа 123405 и 12376415. Найти все натуральные числа, не превышающие 10 000 000 000, которые соответствуют маске 1?3948*5 и при этом без остатка делятся на 3013. В ответе запишите все найденные числа по возрастанию.​

Ответы на вопрос

Ответил Аноним
0

1) Для решения задачи можно использовать цикл от 345678 до 456789 и проверять для каждого числа условие деления без остатка на сумму своих цифр. Если число удовлетворяет условию, то увеличиваем счетчик и, если оно меньше текущего минимума, запоминаем его как новый минимум.

Вот код решения:

count = 0

min_num = float('inf')

for num in range(345678, 456790):

digits_sum = sum(int(digit) for digit in str(num))

if num % digits_sum == 0:

count += 1

if num < min_num:

min_num = num

print("Количество чисел:", count)

if min_num != float('inf'):

print("Наименьшее число:", min_num)

else:

print("Нет чисел, удовлетворяющих условию")

2) Для решения задачи можно использовать цикл от 11000 до 22001 и для каждого числа проверять, сколько из его делителей входят в список (11, 13, 17, 19). Если число удовлетворяет условию, то увеличиваем счетчик и, если оно меньше текущего минимума, запоминаем его как новый минимум.

Вот код решения:

divisors = [11, 13, 17, 19]

count = 0

min_num = float('inf')

for num in range(11000, 22001):

num_divisors = sum(1 for divisor in divisors if num % divisor == 0)

if num_divisors == 2:

count += 1

if num < min_num:

min_num = num

print("Количество чисел:", count)

if min_num != float('inf'):

print("Наименьшее число:", min_num)

else:

print("Нет чисел, удовлетворяющих условию")

3) Для решения задачи можно использовать регулярные выражения. Символ "?" заменяем на "\d", что соответствует любой цифре, а символ "*" на "\d*", что соответствует любой последовательности цифр. Далее генерируем все возможные числа, соответствующие маске, и проверяем для каждого из них условие деления без остатка на 3013.

Вот код решения:

import re

mask = "1?3948*5"

regex = mask.replace("?", "\\d").replace("*", "\\d*")

count = 0

for num in range(10000000000):

if re.fullmatch(regex, str(num)) and num % 3013 == 0:

count += 1

print(num)

print("Количество чисел:", count)

Новые вопросы