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

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

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

(Д. Статный) Текстовый файл 24-233.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и цифры. Определите максимальное число, которое ограничено буквами и не начинается с 0.

Решение

В первую очередь стоит обратить внимание, что ответ превышает число, которое может храниться в 32-разрядном целом, а потому в коде на C++ и PascalABC следует использовать 64-разрядное целое. Альтернативой может служить хранение числа в виде строки, но тогда надо сравнивать не только сами строки, но и их длину.

Самым коротким, но не самым эффективным, будет решение с использованием метода строк split. Заменяем все буквы на какую-то одну и делим строку по этой букве, получая подстроки только из чисел. После этого каждую подстроку анализируем.

Python

s = open('24-233.txt').readline()
for i in 'ABCDEFGHIJKLMNOPQRSTUVWXY':
    s = s.replace(i, 'Z')
mx = 0
for i in s.split('Z'):
    if len(i) > 0 and i[0] != '0':
        mx = max(mx, int(i))
print(mx)

PascalABC

var
    i, max: Int64;
    s: String;
    ss: Array of String;
    c: Char;
    f: TEXT;
begin
    Assign(f, '24-233.txt');
    Reset(f);
    Readln(f, s);
    for c := 'A' to 'Y' do
        s := s.Replace(c, 'Z');
    ss := s.Split('Z');
    max := 0;
    for i := 0 to ss.Length - 1 do
        if (ss[i].Length > 0) and (ss[i][1] <> '0') and (StrToInt64(ss[i]) > max) then
            max := StrToInt64(ss[i]);
    Writeln(max);
end.

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

Python

s = open('24-233.txt').readline()
r = ''
mx = 0
for i in s:
    if i > '9':
        if len(r) > 0 and r[0] != '0':
            mx = max(mx, int(r))
        r = ''
    else:
        r += i
if len(r) > 0 and r[0] != '0':
    mx = max(mx, int(r))
print(mx)

PascalABC

var
    i: Integer;
    max: Int64;
    s, r: String;
    f: TEXT;
begin
    Assign(f, '24-233.txt');
    Reset(f);
    Readln(f, s);
    r := '';
    max := 0;
    for i := 1 to s.Length do
        if s[i] > '9' then
        begin
            if (r.Length > 0) and (r[1] <> '0') and (StrToInt64(r) > max) then
                max := StrToInt64(r);
            r := '';
        end
        else
            r := r + s[i];
        if (r.Length > 0) and (r[1] <> '0') and (StrToInt64(r) > max) then
            max := StrToInt64(r);
    Writeln(max);
end.

C++

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-233.txt");
    string s, r = "";
    long long max = 0;
    f >> s;
    for (int i = 0; i < s.length(); i++)
        if (s[i] > '9')
        {
            if (r.length() > 0 && r[0] != '0' && stoll(r) >max)
                max = stoll(r);
            r = "";
        }
        else
            r += s[i];
    if (r.length() > 0 && r[0] != '0' && stoll(r) > max)
        max = stoll(r);
    cout << max << endl;
}

Ответ

6769550677

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

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

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

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