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