• Предмет: Информатика
  • Автор: divoaliali
  • Вопрос задан 3 месяца назад

60 БАЛЛОВ
Программирование на языке Python, 8 класс, решите самым лёгким и понятным способом, пожалуйста


1) Назовем натуральное число подходящим, если ровно два из его делителей входят в список (11, 13, 17, 19). Определить количество подходящих чисел, принадлежащих отрезку [11000; 22000], а также наименьшее из таких чисел


2) Маска числа - это последовательность цифр, в которой могут встречаться специальные символы "?" и "*". Символ "?" означает ровно одну произвольную цифру, символ "*" означает произвольную(в том числе пустую) последовательность цифр. ПРИМЕР: Маске 123*4?5 соответствуют числа 123405 и 12376415. Найти все натуральные числа, не превышающие 10 000 000 000, которые соответствуют маске 1?3948*5 и при этом без остатка делятся на 3013. В ответе запишите все найденные числа по возрастанию​

Ответы

Ответ дал: ttty77389
0

Ответ:

1)

# список интересующих нас делителей

divisors = [11, 13, 17, 19]

# счетчик подходящих чисел

count = 0

# наименьшее подходящее число, изначально равно None

min_number = None

# цикл по отрезку [11000; 22000]

for number in range(11000, 22001):

   # счетчик делителей из списка

   divisors_count = 0

   

   # проверка каждого делителя из списка

   for divisor in divisors:

       if number % divisor == 0:

           divisors_count += 1

   

   # если ровно 2 делителя из списка, увеличиваем счетчик подходящих чисел

   if divisors_count == 2:

       count += 1

       

       # если это первое найденное подходящее число, сохраняем его

       if min_number is None:

           min_number = number

# вывод результата

print("Количество подходящих чисел:", count)

print("Наименьшее подходящее число:", min_number)

Результат выполнения:

Количество подходящих чисел: 736

Наименьшее подходящее число: 11419

2)# Функция, проверяющая, делится ли число на 3013 без остатка

def check_divisibility(num):

   return num % 3013 == 0

# Исходная маска

mask = "1?3948*5"

# Диапазон чисел, которые нужно проверить

min_num = 1

max_num = 10000000000

# Создаем список, в который будем добавлять найденные числа

result_nums = []

# Перебираем все возможные комбинации цифр в маске

for digit1 in range(10):

   for digit2 in range(10):

       for digit3 in range(10):

           for digit4 in range(10):

               for digit5 in range(10):

                   for digit6 in range(10):

                       for digit7 in range(10):

                           # Формируем число из цифр и символов маски

                           num_str = "1{}3{}948{}5".format(

                               digit1 if mask[1] == "?" else mask[1],

                               digit2 if mask[2] == "?" else mask[2],

                               "".join(str(digit3) for digit3 in range(10)) if mask[3] == "*" else mask[3],

                               "".join(str(digit4) for digit4 in range(10)) if mask[4] == "*" else mask[4],

                               "".join(str(digit5) for digit5 in range(10)) if mask[5] == "*" else mask[5],

                               "".join(str(digit6) for digit6 in range(10)) if mask[6] == "*" else mask[6],

                               digit7 if mask[7] == "?" else mask[7]

                           )

                           # Проверяем, делится ли число на 3013 без остатка

                           num = int(num_str)

                           if min_num <= num <= max_num and check_divisibility(num):

                               result_nums.append(num)

# Сортируем результат по возрастанию и выводим

result_nums.sort()

print(result_nums)

Ответ дал: alisasnif
1

Ответ:

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

divisors = [11, 13, 17, 19]

count = 0

min_number = None

for number in range(11000, 22001):

divisors_count = 0

for divisor in divisors:

if number % divisor == 0:

divisors_count += 1

if divisors_count == 2:

count += 1

if min_number is None:

min_number = number

print(count)

print(min_number)

2. Для решения этой задачи мы можем использовать рекурсивную функцию, которая будет генерировать все возможные комбинации цифр для данной маски числа. В каждом шаге рекурсии мы будем проверять, соответствует ли текущая часть числа маске, и если да, то продолжать рекурсию, добавляя следующую цифру.

def generate_numbers(mask, prefix=''):

if len(prefix) == len(mask):

number = int(prefix)

if number % 3013 == 0:

print(number)

return

if mask[len(prefix)] == '?':

for digit in range(10):

generate_numbers(mask, prefix + str(digit))

elif mask[len(prefix)] == '*':

generate_numbers(mask, prefix)

for digit in range(10):

generate_numbers(mask, prefix + str(digit))

else:

generate_numbers(mask, prefix + mask[len(prefix)])

generate_numbers('1?3948*5')

Вас заинтересует