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

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

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

(Д. Статный) Текстовый файл 24-234.txt состоит не более чем из 106 символов и содержит только десятичные цифры. Определите такое максимальное число, не превышающее 106, в котором сумма всех цифр, возведенных в степень, равную длине числа, равна самому числу. В ответе укажите количество повторений этого числа в файле.

Решение

Создадим внешний цикл по длине максимального числа (от 6 до 1). Внутренний цикл последовательно перебирает в строке числа такой длины и ищет максимальное удовлетворяющее условию задачи. Если какое-то значение уже было найдено, то внешний цикл прерывается, т.к. более короткое число будет однозначно меньше.После этого ищем, сколько раз строка с указанным числом присутствует в исходной строке.

Python

s = open('24-234.txt').readline()
mx = 0
for i in range(6, 0, -1):
    for j in range(len(s) - i + 1):
        if s[j] != '0':
            s1 = s[j: j + i]
            sm = sum(map(lambda x: int(x) ** i, s1))
            if sm == int(s1):
                mx = max(mx, int(s1))
    if mx != 0:
        break
print(s.count(str(mx)))

PascalABC

var
    max, n, m, k, i, j: Integer;
    sum: Real;
    s, s1: String;
    f: TEXT;
begin
    Assign(f, '24-234.txt');
    Reset(f);
    Readln(f, s);
    max := 0;
    for i := 6 downto 1 do
    begin
        for j := 1 to s.Length - i do
            if s[j] <> '0' then
            begin
                sum := 0;
                n := 0;
                for m := 0 to i - 1 do
                begin
                    n := n * 10 + ord(s[j + m]) - 48;
                    sum := sum + power(ord(s[j + m]) - 48, i);
                end;
                if (sum = n) and (n > max) then
                    max := n;
            end;
        if max <> 0 then
            break;
    end;
    s1 := max.ToString;
    k := 0;
    for i := 1 to s.Length - s1.Length + 1 do
        if s[i:i + s1.Length] = s1 then
            k := k + 1;
    Writeln(k);
end.

C++

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    ifstream f;
    f.open("24-234.txt");
    string s;
    f >> s;
    int max = 0;
    for (int i = 6; i > 0; i--)
    {
        for (int j = 0; j <= s.length() - i; j++)
            if (s[j] != '0')
            {
                double sum = 0;
                int n = 0;
                for (int m = 0; m < i; m++)
                {
                    n = n * 10 + (int)s[j + m] - 48;
                    sum += pow((int)s[j + m] - 48, i);
                }
                if (sum == n && n > max)
                    max = n;
            }
        if (max != 0)
            break;
    }
    string s1 = to_string(max);
    int k = 0;
    for (int i = 0; i <= s.length() - s1.length(); i++)
        if (s.substr(i, s1.length()) == s1)
            k++;
    cout << k << endl;
}

Ответ

1
Найденное число: 548834

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

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

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

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