Программное решение задач ЕГЭ по информатике

Задача 6678. Источник: Поляков. Задание КИМ 24

Страница задачи 6678

(В. Шубинкин) Текстовый файл 24-268.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и цифры. В файле записаны числа в девятнадцатеричной системе счисления, окружённые символами, не являющимися цифрами в этой системе счисления или началом/концом файла. Лидирующие нули в записи чисел не допускаются. Определите самое большое чётное число в этом файле. Например, в последовательности символов FF2FTZBBC8R420Y0CCCE содержится 3 числа в девятнадцатеричной системе счисления: FF2F, BBC8 и 420. Самое большое чётное число – BBC8. Число CCCE не учитывается, так как перед ним стоит ноль.

Алфавит двадцатеричной системы счисления: 0123456789ABCDEFGHI.

Решение

Наиболее короткое решение базируется на разделении строки на подстроки с последующим их анализом. Заменяем все буквы, не входящие в девятнадцатеричную систему счисления на одну и делим строку по этой букве методом split. Обратите внимание, что четность числа в системе счисления с нечетным основанием не зависит от последнего разряда. Можно перевести число из девятнадцатеричной системы счисления в десятичную и затем проверить его четность, но есть путь проще. Четное число в системе счисления с нечетным основанием имеет четное количество нечетных цифр. Четность разряда можно определить по коду: цифры должны имет нечетный код, а буквы - четный.

Python

s = open('24-268.txt').readline()
for i in 'JKLMNOPQRSTUVWXY':
    s = s.replace(i, 'Z')
mx = ''
for i in s.split('Z'):
    if len(i) > 0 and i[0] != '0':
        k = 0
        for j in i:
            if (j in '0123456789') == (ord(j) % 2 == 1):
                k += 1
        if k % 2 == 0 and (len(i) > len(mx) or len(i) == len(mx) and i > mx):
            mx = i
print(mx)

PascalABC

var
    i, j, k: Integer;
    s, mx: String;
    ss: Array of String;
    c: Char;
    f: TEXT;
begin
    Assign(f, '24-268.txt');
    Reset(f);
    Readln(f, s);
    for c := 'J' to 'Y' do
        s := s.Replace(c, 'Z');
    ss := s.Split('Z');
    for i := 0 to ss.Length - 1 do
        if (ss[i].Length > 0) and (ss[i][1] <> '0') then
        begin
            k := 0;
            for j := 1 to ss[i].Length do
                if (ss[i][j] in ['0'..'9']) = (ord(ss[i][j]) mod 2 = 1) then
                    k := k + 1;
            if (k mod 2 = 0) and ((ss[i].Length > mx.Length) or
                (ss[i].Length = mx.Length) and (ss[i] > mx)) then
                mx := ss[i];
        end;
    Writeln(mx);
end.

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

Python

s = open('24-268.txt').readline()
r = ''
mxr = ''
k = 0
for i in s:
    if i > 'I':
        if len(r) > 0 and r[0] != '0' and k % 2 == 0:
            if len(r) > len(mxr) or len(r) == len(mxr) and r > mxr:
                mxr = r
        r = ''
        k = 0
    else:
        r += i
        if (i in '0123456789') == (ord(i) % 2 == 1):
            k += 1
if len(r) > 0 and r[0] != '0' and k % 2 == 0:
    if len(r) > len(mxr) or len(r) == len(mxr) and r > mxr:
        mxr = r
print(mxr)

PascalABC

var
    i, k: Integer;
    s, r, mxr: String;
    f: TEXT;
begin
    Assign(f, '24-268.txt');
    Reset(f);
    Readln(f, s);
    r := '';
    mxr := '';
    k := 0;
    for i := 1 to s.Length do
        if s[i] > 'I' then
        begin
            if (r.Length > 0) and (r[1] <> '0') and (k mod 2 = 0) and
               ((r.Length > mxr.Length) or (r.Length = mxr.Length) and (r > mxr)) then
                mxr := r;
            r := '';
            k := 0;
        end
        else
        begin
            r := r + s[i];
            if (s[i] in ['0'..'9']) = (ord(s[i]) mod 2 = 1) then
              k := k + 1;
        end;
        if (r.Length > 0) and (r[1] <> '0') and (k mod 2 = 0) and
           ((r.Length > mxr.Length) or (r.Length = mxr.Length) and (r > mxr)) then
            mxr := r;
    Writeln(mxr);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-268.txt");
    string s, r = "", mxr = "", d = "0123456789";
    f >> s;
    int k = 0;
    for (int i = 0; i < s.length(); i++)
        if (s[i] > 'I')
        {
            if (r.length() > 0 && r[0] != '0' && k % 2 == 0 &&
                (r.length() > mxr.length() || r.length() == mxr.length() && r > mxr))
                mxr = r;
            r = "";
            k = 0;
        }
        else
        {
            r += s[i];
            if ((d.find(s[i]) != -1) == ((int)s[i] % 2 == 1))
                k++;
        }
    if (r.length() > 0 && r[0] != '0' && k % 2 == 0 &&
        (r.length() > mxr.length() || r.length() == mxr.length() && r > mxr))
        mxr = r;
    cout << mxr << endl;
}

Ответ

GGA55CF9

Отправить замечание по решению

Код по которому имеется замечание:

Ваш вариант кода:

Комментарий: