Главная Посты Курсы Связь О сайте

ЕГЭ по информатике 2023 - Задание 25 (Делимость чисел)



Всем привет! Добрались мы до 25 задания из ЕГЭ по информатике 2023.


Рассмотрим типовые задачи, а так же новые формулировки 25 задания из ЕГЭ по информатике 2023.


Приступаем к первой классической задаче.



Задача (ЕГЭ по информатике, Демо 2022)

Пусть M – сумма минимального и максимального натуральных делителей целого числа, не считая единицы и самого числа. Если таких делителей у числа нет, то значение M считается равным нулю.


Напишите программу, которая перебирает целые числа, бо́льшие 700 000, в порядке возрастания и ищет среди них такие, для которых значение M оканчивается на 8. Выведите первые пять найденных чисел и соответствующие им значения M.


Формат вывода: для каждого из пяти таких найденных чисел в отдельной строке сначала выводится само число, затем – значение М. Строки выводятся в порядке возрастания найденных чисел.


Количество строк в таблице для ответа избыточно.


ЕГЭ по информатике демоверсия 2022 - задание 25


Решение:

На ЕГЭ по информатике 2023 удобно писать программы на языке Python.


import math
count=0
for i in range(700001, 800000):

    b=0
    
    for j in range(2, int(math.sqrt(i)) + 1):
        if i%j==0:
            b=i//j
            break
    
    
    if  b==0: M=0
    else: M=j+b

    if M!=0 and M%10==8:
        count=count+1
        print(i, M)

    if count==5: break

В данной программе перебираются числа в цикле for, начиная с 700001.


Переменная b — считается наибольшим делителем числа i. Затем, с помощью ещё одного цикла for перебираются числа с 2 до корня числа i (включительно). Ищем тем самым наименьший делитель.


Если до корня числа включительно не встретился ни один делитель, значит, у числа нет делителей, кроме 1 и самого числа.



ЕГЭ по информатике демоверсия 2022 - задание 25 поиск делителей

Пусть у нас есть число A. Если у этого числа есть делитель d1, то он находится до корня этого числа. А вот то число (так же делитель d4), на которое умножается d1, чтобы получить A, будет находиться после корня A.


Получается, что у каждого делителя есть своя пара. У единицы - это само число. Причём один делитель из пары находится до корня, другой после корня. Исключением будет тот случай, когда из числа А извлекается целый корень. Тогда для этого корня не будет пары (парой и будет само это число √A * √A = A).


Таким образом, первый найденный делитель будет являться наименьшим делителем. А вот делительный, который находится в паре с наименьшим делителем, будет наибольшим.


После того, как мы нашли наименьший делитель (он будет сидеть в переменной j) и наибольший делитель b, выходим из второго цикла for.


Если переменная b осталась равна нулю, то, значит, у числа i нет указанных делителей, и переменная M должна равняться 0. Если b не равна нулю, то M=j+b.


Проверить, на что оканчивается число, можно узнав остаток от деления числа на 10.


Переменная count следит, чтобы было распечатано ровно 5 чисел, которые удовлетворяют условию задачи.


Ответ:
700005233338
700007100008
700012350008
700015140008
70003124168




Задача (Стандартная)

Напишите программу, которая перебирает целые числа, большие 550 000, в порядке возрастания и ищет среди них такие, для которых наибольший натуральный делитель, не равный самому числу, не является простым числом.


Программа должна найти и вывести первые 6 таких чисел и соответствующие им значения упомянутых делителей.


Формат вывода: для каждого из 6 таких найденных чисел в отдельной строке сначала выводится само число, затем упомянутый делитель. Строки выводятся в порядке возрастания найденных чисел.


Например, для числа 105 наибольший натуральный делитель 35 не является простым, для числа 15 наибольший натуральный делитель 5 — простое число, а для числа 13 такого делителя не существует.


ЕГЭ по информатике демоверсия 2022 - задание 25


Решение:

Здесь мы ищем наибольший делитель числа, как и в прошлом решении.


import math

def Pr(x):
    for i in range(2, int(math.sqrt(x))+1):
        if x%i==0: return False
    return True


count=0
for i in range(550001, 1000000):

    b=0
    
    for j in range(2, int(math.sqrt(i)) + 1):
         if i%j==0:
            b=i//j
            break


    if not(Pr(b)):
        count=count+1
        print(i, b)

    if count==6: break

Чтобы проверить число, является ли оно простым, напишем функцию Pr(). Там мы проходим до корня числа. Если не встретился не один делитель, значит, число простое — возвращаем True. Если до корня хотя бы один делитель встретили — возвращаем False.


Ответ:
550002275001
550004275002
550005183335
550008275004
550010275005
550011183337




Задача (Ровно 4 различных делителя)

Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [258274; 258297], числа, имеющие ровно 4 различных делителя. Выведите для каждого найденного числа два наибольших делителя в порядке возрастания.


Решение:
import math

for i in range(258274, 258298):
    a=[]
    for j in range(1, int(math.sqrt(i))+1):
        if i%j==0:
            a.append(j)
            b=i//j
            if j!=b:
                a.append(b)

    if len(a)==4:
        a.sort()
        print(a[2], a[3])

Здесь для каждого числа i заводим массив a, где будем сохранять все его делители. Идём как всегда до корня. Если мы нашли делитель, мы добавляем его в массив a c помощью команды append и ищем его "брата". Второй делитель ("брат") не должен равняться самому делителю j, т.к. нам сказали, что все делители должны быть различны. Одинаковые делители j и b могут получится, если из нашего числа i извлекается целый корень. Ведь для делителя √i является парой этот же делитель ( √i* √i=i).


После прохождения внутреннего цикла (с переменной j) в массиве a будут сидеть все делители числа i. Если их ровно 4, то сортируем массив a и выводим на экран два наибольших.



Ответ:
15193258281
1427258287
1493258289
36899258293
51659258295




Задача (Крепкий орешек)

Назовём нетривиальным делителем натурального числа его делитель, не равный единице и самому числу. Найдите все натуральные числа, принадлежащие отрезку [4234679; 10157812] и имеющие ровно три нетривиальных делителя. Для каждого найденного числа запишите в ответе само число и его наибольший нетривиальный делитель. Найденные числа расположите в порядке возрастания.



Решение:
import math

for i in range(4234679, 10157813):
    if int(math.sqrt(i))**2 == i:
        a=[]
        for j in range(2, int(math.sqrt(i))+1):
            if i%j==0:
                a.append(j)
                b=i//j
                if j!=b:
                    a.append(b)
        if len(a)==3:
            a.sort()
            print(i, a[2])

Как у нас могут быть три различных нетривиальных делителя, когда делители идут, как мы выяснили, парами. Это может быть, когда существует целый корень из этого числа. Тогда в паре два числа будут одинаковыми (√i* √i = i). Поэтому в этой задаче нас интересуют числа из которых извлекается елый корень.


Если этим рассуждением не воспользуемся, то программа будет считать очень долго, потому что здесь диапазон и сами числа очень большие.


Далее, решаем, как и в прошлый раз.


Ответ:
4879681103823
7890481148877




Задача (ЕГЭ по информатике, 20.06.22)

Назовём маской числа последовательность цифр, в которой также могут встречаться следующие символы:


— символ "?" означает ровно одну произвольную цифру;

— символ "*" означает любую последовательность цифр произвольной длины; в том числе "*" может задавать и пустую последовательность.


Например, маске 123*4?5 соответсвуют числа 123405 и 12300405.


Среди натуральных чисел, не превышающих 108, найдите все числа, соответствующие маске 1234*7, делящиеся на 141 без остатка.


В ответе запишите в первом столбце таблицы все найденные числа в порядке возрастания, а во втором столбце — соответствующие им результаты деления этих чисел на 141.


Решение:

Здесь самый главный момент заключается в том, что есть верхняя граница 108. Т.е. самое большое число, которое нужно рассмотреть 1234[999]7 <= 108 = 100000000. Нижняя граница тоже задана, когда вместо звёздочки ни одной цифры не будет 12347.


i=12347

#Вместо звёздочки ноль разрядов
if i%141==0:
    print(i, i//141)

#Вместо звёздочки один разряд
for x in '0123456789':
    s = '1234' + x + '7'
    i=int(s)
    if i%141==0:
        print(i, i//141)

#Вместо звёздочки два разряда
for x in '0123456789':
    for y in '0123456789':
        s = '1234' + x + y + '7'
        i=int(s)
        if i%141==0:
            print(i, i//141)

#Вместо звёздочки три разряда
for x in '0123456789':
    for y in '0123456789':
        for z in '0123456789':
            s = '1234' + x + y + z + '7'
            i = int(s)
            if i%141==0:
                print(i, i//141)

Таким образом, нужно рассмотреть, когда вместо звёздочки ноль разрядов, один разряд, два разряда и три разряда.


Каждый разряд перебираем как цифры (символы). Формируем строку s, а затем её переводим в тип int.


Когда два разряда или три разряда нужно перебирать строку с помощью вложенных циклов.


Ответ:
12347378757
1234130787527
1234271787537
1234412787547
1234553787557
1234694787567
1234835787577
1234976787587





04-08-2022 в 09:36:45







Поддержать сайт:

Похожая статья:

Задачи из реального экзамена ЕГЭ по информатике 20.06.22 (Часть 1)

Эта статья посвящена задачам из реального экзамена ЕГЭ по информатике ...

Категория: ЕГЭ  Подкатегория: -
Дата: 15-01-2018 в 16:47:34 0



Оставить коментарий:



Напишите email, чтобы получать сообщения о новых комментариях (необязательно):


Задача против робота. Расположите картинки горизонтально: