Задача 5799. Источник: Поляков. Задание КИМ 17
(П. Финкель) В файле 17-346.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от 1 до 200 000 включительно. Определите количество троек последовательности, для которых произведение всех цифр трёх чисел не превосходит 2·109 и удовлетворяет маске «43*6*». В качестве ответа укажите количество таких троек и наибольшее произведение их цифр. В данной задаче под тройкой подразумевается три идущих подряд элемента последовательности.
Решение
Использование списка или массива для хранения исходных данных и использование циклов позволит уменьшить объем кода. Анализ произведения шаблону производится через операции со строками. В заданиях 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:
p *= z % 10
z //= 10
if p <= 2000000000:
s = str(p)
if s[:2] == "43" and "6" 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
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] = '4') and (s[2] = '3') and s[3:].Contains('6') 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)
{
p *= z % 10;
z /= 10;
}
}
if (p <= 2000000000)
{
stringstream ss;
string s;
ss << p;
ss >> s;
if (s[0] == '4' && s[1] == '3' && s.find('6', 2) != -1)
{
k++;
if (p > max)
max = p;
}
}
d[0] = d[1];
d[1] = d[2];
}
cout << k << " " << max << endl;
}
Ответ
10 438939648