Задача 5805. Источник: Поляков. Задание КИМ 24
(С. Якунин) Текстовый файл 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