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

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

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

(П. Финкель) Текстовый файл 24-225.txt состоит не более чем из 106 символов и содержит буквы английского алфавита и цифры. Определите максимальное число в этом файле, ограниченное двумя парами символов CC и удовлетворяющее маске «234???57???8», где символ ? обозначает любую цифру. Пример такого числа: 234123574568. Найдите произведение нечётных цифр найденного числа.

Решение

Анализ файла данных показывает наличие в нем последовательностей из трех символов C. Хотя после такой комбинации нет чисел, нет гарантии, что их не может быть в другом файле данных. Поэтому использование метода split может дать неверный результат. Для получения гарантированного верного результата необходимо искать последовательности CC и анализировать подстроки между ними.

Python с использованием посимвольной обработки

  1. s = open('24-225.txt').readline()
  2. mx = ''
  3. last = -1
  4. for i in range(len(s) - 1):
  5. if s[i] == 'C' and s[i + 1] == 'C':
  6. if last != - 1:
  7. s1 = s[last + 2:i]
  8. if len(s1) == 12 and s1.isdigit():
  9. if s1[:3] == '234' and s1[6:8] == '57' and s1[11] == '8':
  10. mx = max(mx, s1)
  11. last = i
  12. m = 1
  13. for c in mx:
  14. if int(c) % 2 == 1:
  15. m *= int(c)
  16. print(m)

Python с использованием поиска в строке

  1. s = open('24-225.txt').readline()
  2. mx = ''
  3. start = s.find('CC')
  4. while (start != -1):
  5. finish = s.find('CC', start + 1)
  6. if finish != -1:
  7. s1 = s[start + 2: finish]
  8. if len(s1) == 12 and s1.isdigit():
  9. if s1[:3] == '234' and s1[6:8] == '57' and s1[11] == '8':
  10. mx = max(mx, s1)
  11. start = finish
  12. m = 1
  13. for c in mx:
  14. if int(c) % 2 == 1:
  15. m *= int(c)
  16. print(m)

PascalABC с использованием посимвольной обработки

  1. function IsDigit(s: String): Boolean;
  2. var
  3. c: Char;
  4. begin
  5. result := True;
  6. foreach c in s do
  7. if not c.IsDigit() then
  8. begin
  9. result := False;
  10. break;
  11. end;
  12. end;
  13. var
  14. last, i, m: Integer;
  15. max, s, s1: String;
  16. c: Char;
  17. f: TEXT;
  18. begin
  19. Assign(f, '24-225.txt');
  20. Reset(f);
  21. Readln(f, s);
  22. max := '';
  23. last := -1;
  24. for i := 1 to s.Length - 1 do
  25. if (s[i] = 'C') and (s[i + 1] = 'C') then
  26. begin
  27. if last <> -1 then
  28. begin
  29. s1 := s[last + 2:i];
  30. if (s1.Length = 12) and IsDigit(s1) then
  31. if (s1[:4] = '234') and (s1[7:9] = '57') and (s1[12] = '8') then
  32. if s1 > max then
  33. max := s1;
  34. end;
  35. last := i;
  36. end;
  37. m := 1;
  38. foreach c in max do
  39. if ord(c) mod 2 = 1 then
  40. m := m * (ord(c) - 48);
  41. Writeln(m);
  42. end.

PascalABC с использованием поиска в строке

  1. function IsDigit(s: String): Boolean;
  2. var
  3. c: Char;
  4. begin
  5. result := True;
  6. foreach c in s do
  7. if not c.IsDigit() then
  8. begin
  9. result := False;
  10. break;
  11. end;
  12. end;
  13. var
  14. start, finish, m: Integer;
  15. max, s, s1: String;
  16. c: Char;
  17. f: TEXT;
  18. begin
  19. Assign(f, '24-225.txt');
  20. Reset(f);
  21. Readln(f, s);
  22. max := '';
  23. start := s.IndexOf('CC');
  24. while start <> -1 do
  25. begin
  26. finish := s.IndexOf('CC', start + 1);
  27. if finish <> -1 then
  28. begin
  29. s1 := s[start + 3:finish + 1];
  30. if (s1.Length = 12) and IsDigit(s1) then
  31. if (s1[:4] = '234') and (s1[7:9] = '57') and (s1[12] = '8') then
  32. if s1 > max then
  33. max := s1;
  34. end;
  35. start := finish;
  36. end;
  37. m := 1;
  38. foreach c in max do
  39. if ord(c) mod 2 = 1 then
  40. m := m * (ord(c) - 48);
  41. Writeln(m);
  42. end.

C++ с использованием посимвольной обработки

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. bool isdigit(string s)
  5. {
  6. for (int i = 0; i < s.length(); i++)
  7. if (s[i] < '0' or s[i] > '9')
  8. return false;
  9. return true;
  10. }
  11. int main()
  12. {
  13. ifstream f;
  14. f.open("24-225.txt");
  15. string s, max = "";
  16. f >> s;
  17. int last = -1;
  18. for (int i = 0; i < s.length() - 1; i++)
  19. if (s[i]== 'C' && s[i + 1] == 'C')
  20. {
  21. if (last != -1)
  22. {
  23. string s1 = s.substr(last + 2, i - last - 2);
  24. if (s1.length() == 12 and isdigit(s1))
  25. if (s1.substr(0, 3) == "234" && s1.substr(6, 2) == "57" && s1[11] == '8')
  26. if (s1 > max)
  27. max = s1;
  28. }
  29. last = i;
  30. }
  31. int m = 1;
  32. for (int i = 0; i < max.length(); i++)
  33. if ((int)max[i] % 2 == 1)
  34. m *= (int)max[i] - 48;
  35. cout << m << endl;
  36. }

C++ с использованием поиска в строке

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. bool isdigit(string s)
  5. {
  6. for (int i = 0; i < s.length(); i++)
  7. if (s[i] < '0' or s[i] > '9')
  8. return false;
  9. return true;
  10. }
  11. int main()
  12. {
  13. ifstream f;
  14. f.open("24-225.txt");
  15. string s, max = "";
  16. f >> s;
  17. int start = s.find("CC");
  18. while (start != -1)
  19. {
  20. int finish = s.find("CC", start + 1);
  21. if (finish != -1)
  22. {
  23. string s1 = s.substr(start + 2, finish - start - 2);
  24. if (s1.length() == 12 and isdigit(s1))
  25. if (s1.substr(0, 3) == "234" && s1.substr(6, 2) == "57" && s1[11] == '8')
  26. if (s1 > max)
  27. max = s1;
  28. }
  29. start = finish;
  30. }
  31. int m = 1;
  32. for (int i = 0; i < max.length(); i++)
  33. if ((int)max[i] % 2 == 1)
  34. m *= (int)max[i] - 48;
  35. cout << m << endl;
  36. }

Ответ

972405

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

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

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

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