Статья Автор: Лебедев Дмитрий

Разбор варианта Статграда от 24 октября 2024 года. Часть 3 (24.25)

Разбор варианта Статграда от 24 октябоя 2024 года. Часть 3 (24, 25)
задание 24 Задание 25
   

 

Задание 24 (ссылка на задание)
Текстовый файл состоит из цифр от 1 до 6, знаков операций «–» и «*» (вычитание и умножение) и заглавных латинских букв A, B, C, D.
Определите максимальное количество символов в непрерывной последовательности символов, состоящей из буквы A, за которой следует корректное арифметическое выражение с целыми неотрицательными числами, записанными в десятичной системе счисления.
Данное задание нельзя считать очень сложным (задания основной волны 2024 года было сложнее). Это задание надо рассматривать как подготовительное.

Путь к решению виден сразу
  • считать строку целиком 
  • создать список "сплитуя" по 'A' 
  • выделить из каждого элемента списка "требуемое" начало
  • вывести лучший результат
Возможные подводные камни
  • можно забыть, что символ A входит в ответ - ответ будет на 1 меньше требуемого 
  • вместо поиска начального фрагмента проверять всю строку - будет получен возможный ответ и поймать ошибку будет сложно
Предположим, что
  1. Попробуем реализовать программу по этапам
  2. Быстро написали код и получили правдоподобный ответ.
Вначале организовать считывание, "сплитование" и подпрограмму
 


Избежать подобную ошибку можно, если
  • сделать запуск на ограниченном объёме 
  • организовать отладочную печать
В следующем коде можно менять значения в строке 7, "двигать" оператор print в зону if и смотреть результаты


Правильный алгоритм для подпрограммы f24(ss) может оприарться на поиск начальной подстроки, в которой
  • нет символо "BCD" и комбинаций "--", "-*", "*-", "**"
  • первый и последний символы не '-', '*'
Такую подпрограмму можно реализовать различными способами. 
Предложим подход с продвижением указателя до встречи с запретом. Условие запрета на последний символ проверим отдельно
 


Финальная версия (как на экзамене)


Задание 25 (ссылка на задание)

Пусть M (N) – сумма 2 наибольших различных натуральных делителей натурального числа N, не считая самого числа и единицы.
Если у числа N меньше 2 таких делителей, то M (N) считается равным 0.

Найдите все такие числа N, что 110 250 000 ≤ N ≤ 110 300 000,
а десятичная запись числа M (N) заканчивается на 1002.

В ответе запишите все найденные числа в порядке возрастания.
Каждое число вводите в новой строке.

Задание довольно "хитрое", поскольку требуется найти ДВА делителя.
Вместо максимальных можно искать минимальные и по ним определять максимальные. Это надо сделать для каждого из заданных 50000 чисел 

  1. найдем x - минимальный простой делитель числа (он же мнинимальный); kx - степень его вхождения в разложение числа
  2. найдем y - минимальный делитель числа n//xkx  
  3. разберем возможные случаи
    • kx> 1 минимальные делители выбираем из набора (x,x2,y)
    • kx == 1 минимальные делители (x,y)
Для понимания, зачем это нужно, можно взять число 100 - минимальные делители 2 и 22 ,  а простые 2, 5
Код программы мог выглядеть так (в коде учитывается, что простые числа и квадраты простых не подходят)
Главное, организовать поиск делителя до "корня"


Вывод списка делителей полезен, он дает понимание сути решения
Практически делается два шага факторизации числа (то есть разложения на множители с учетом степеней)
Приведем решение с использованием факторизации (скорее в ознакомительных целях, чем в практических)
  • программа fmin_del(n,d)  - ищет минимальный делитель не меньший d (это более общая реализации, ускоряющая процесс при факторизации)
  • программа факторизации f25(n) - получает разложение числа на простые множители и может использоваться для поиска числа делителей и суммы делителей
Программа будет выполняться немного дольше, чем без факторизации

Прикрепленные файлы
24_24-10.txt
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать