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

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

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

(С. Якунин) Текстовый файл 24-232.txt состоит не более чем из 104 десятичных цифр. Найдите наибольшую длину последовательности цифр, отличных от 0, которая ограничена с двух сторон цифрами 0 и в которой сумма цифр кратна 5. В ответе запишите сумму цифр этой последовательности.

Решение

Наиболее компактное решение можно создать с использованием метода строк split. Делим строку по символу 0 и анализируем каждую подстроку.

Python

s = open('24-232.txt').readline()
mx = 0
mxs = 0
for i in s.split('0')[1:-1]:
    if len(i) > 0 and sum(map(int, i)) % 5 == 0 and len(i) > mx:
        mx = len(i)
        mxs = sum(map(int, i))
print(mxs)

PascalABC

var
    max, maxs, sum: Int64;
    s, i: String;
    ss: Array of String;
    c: Char;
    f: TEXT;
begin
    Assign(f, '24-232.txt');
    Reset(f);
    Readln(f, s);
    ss := s.Split('0');
    max := 0;
    maxs := 0;
    foreach i in ss[1:ss.Length - 1] do
    begin
        sum := 0;
        foreach c in i do
            sum := sum + ord(c) - 48;
        if (sum mod 5 = 0) and (i.Length > max) then
        begin
            max := i.Length;
            maxs := sum;
        end;
    end;
    Writeln(maxs);
end.

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

Python

s = open('24-232.txt').readline()
mx = 0
mxs = 0
k = 0
sm = 0
for i in range(s.find('0') + 1, s.rfind('0') + 1):
    if s[i] == '0':
        if sm % 5 == 0 and k > mx:
            mx = k
            mxs = sm
        k = 0
        sm = 0
    else:
        k += 1
        sm += int(s[i])
print(mxs)

PascalABC

var
    i, max, maxs, k, sum: Integer;
    s: String;
    f: TEXT;
begin
    Assign(f, '24-232.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    maxs := 0;
    k := 0;
    sum := 0;
    for i := s.IndexOf('0') + 2 to s.LastIndexOf('0') + 1 do
        if s[i] = '0' then
        begin
            if (sum mod 5 = 0) and (k > max) then
            begin
                max := k;
                maxs := sum;
            end;
            k := 0;
            sum := 0;
        end
        else
        begin
            k := k + 1;
            sum := sum + ord(s[i]) - 48;
        end;
    Writeln(maxs);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-232.txt");
    string s;
    f >> s;
    int max = 0, maxs = 0, k = 0, sum = 0;
    for (int i = s.find('0') + 1; i <= s.rfind('0'); i++)
        if (s[i] == '0')
        {
            if (sum % 5 == 0 && k > max)
            {
                max = k;
                maxs = sum;
            }
            k = 0;
            sum = 0;
        }
        else
        {
            k++;
            sum += (int)s[i] - 48;
        }
    cout << maxs << endl;
}

Ответ

375

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

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

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

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