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

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

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

(П. Финкель) В файле 17-346.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от 1 до 200 000 включительно. Определите количество троек последовательности, для которых произведение всех чётных цифр трёх чисел не превосходит 2·109 и удовлетворяет маске «25*2*». В качестве ответа укажите количество таких троек и наибольшее произведение их цифр. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.

Решение

Исходные данные (все или только тройку чисел) помещаем в список, чтобы обработать их в цикле и уменьшить объем кода. Анализ соответствия произведения разрядов шаблону осуществим через строки. Альтернативный анализ через флаговую переменную можно посмотреть в заданиях 5804, 5802 и 5800.

Python

f = open("17-346.txt")
d = [int(i) for i in f]
k = 0
mx = 0
for i in range(len(d) - 2):
    p = 1
    for j in range(3):
        z = d[i + j]
        while z > 0:
            if z % 2 == 0:
                p *= z % 10
            z //= 10
    if p <= 2000000000:
        s = str(p)
        if s[:2] == "25" and "2" in s[2:]:
            k += 1
            mx = max(mx, p)
print(k, mx)

PascalABC

var
    k, max, z, i: Integer;
    p: int64;
    d: array [1..3] of Integer;
    s: String;
    f: TEXT;
begin
    Assign(f, '17-346.txt');
    Reset(f);
    k := 0;
    max := 0;
    Readln(f, d[1], d[2]);
    while not eof(f) do
    begin
        Readln(f, d[3]);
        p := 1;
        for i := 1 to 3 do
        begin
            z := d[i];
            while z > 0 do
            begin
                if z mod 2 = 0 then
                    p := p * (z mod 10);
                z := z div 10;
            end;
        end;
        if p <= 2000000000 then
        begin
            s := p.ToString();
            if (Length(s) > 2) and (s[1] = '2') and (s[2] = '5') and s[3:].Contains('2') then
            begin
                k := k + 1;
                if p > max then
                    max := p;
            end;
        end;
        d[1] := d[2];
        d[2] := d[3];
    end;
    Writeln(k, ' ', max);
end.

C++

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("17-346.txt");
    int d[3];
    int k = 0, max = 0;
    f >> d[0] >> d[1];
    while (f >> d[2])
    {
        long long p = 1;
        for (int i = 0; i < 3; i++)
        {
            int z = d[i];
            while (z > 0)
            {
                if (z % 2 == 0)
                    p *= z % 10;
                z /= 10;
            }
        }
        if (p <= 2000000000)
        {
            stringstream ss;
            string s;
            ss << p;
            ss >> s;
            if (s[0] == '2' && s[1] == '5' && s.find('2', 2) != -1)
            {
                k++;
                if (p > max)
                    max = p;
            }
        }
        d[0] = d[1];
        d[1] = d[2];
    }
    cout << k << " " << max << endl;
}

Ответ

7 25165824

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

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

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

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