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