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

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

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

(А. Богданов) Назовём маской числа последовательность цифр, в которой может встречаться символ «#», означающий любое число, которое делится без остатка на куб суммы своих цифр. Среди натуральных чисел, не превышающих 1010, найдите все числа, соответствующие маске 1234#, делящиеся на 137 без остатка. В ответе запишите все найденные числа в порядке возрастания, справа от каждого числа – частное от его деления на 137.

Решение

От минимального числа, удовлетворяющего шаблону и условию задачи, найдем первое число, кратное 137 и организуем цикл с данным шагом. В цикле проверяем, соответствует ли число шаблону. Проверку можно производить, как целочисленными операциями, так и через строки. Для компилируемых языков быстрее работают решения с целочисленными операциями, а для Python - с обработкой строк.

Python анализ целочисленными операциями

z = 12341
while z % 137 != 0:
    z += 1
for n in range(z, 1235000000, 137):
    x = n
    k = 0
    sm = 0
    while x > 9999:
        k += 1
        sm += x % 10
        x //= 10
    if x == 1234 and (n - 1234 * 10 ** k) % sm ** 3 == 0:
        print(n, n // 137)

Python анализ через строки

z = 12341
while z % 137 != 0:
    z += 1
for n in range(z, 1235000000, 137):
    s = str(n)
    if s[:4] == '1234':
        s1 = s[4:]
        sm = 0
        for i in s1:
            sm += int(i)
        if int(s1) % sm ** 3 == 0:
            print(n, n // 137)

PascalABC анализ целочисленными операциями

var
    n, x, k, sm: Integer;
begin
    n := 12341;
    while n mod 137 <> 0 do
        n := n + 1;
    while n < 1235000000 do
    begin
        x := n;
        k := 0;
        sm := 0;
        while x > 9999 do
        begin
            k := k + 1;
            sm := sm + x mod 10;
            x := x div 10;
        end;
        if (x = 1234) and ((n - round(1234 * power(10, k))) mod (sm * sm * sm) = 0) then
            Writeln(n, ' ', n div 137);
        n := n + 137;
    end;
end.

PascalABC анализ через строки

var
    n, sm, i: Integer;
    s, s1: String;
begin
    n := 12341;
    while n mod 137 <> 0 do
        n := n + 1;
    while n < 1235000000 do
    begin
        s := IntToStr(n);
        if s[:5] = '1234' then
        begin
            s1 := s[5:];
            sm := 0;
            for i := 1 to s1.Length do
                sm := sm + StrToInt(s1[i]);
            if StrToInt(s1) mod (sm * sm * sm) = 0 then
                Writeln(n, ' ', n div 137);
        end;
        n := n + 137;
    end;
end.

C++ анализ целочисленными операциями

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int z = 12341;
    while (z % 137 != 0)
        z++;
    for (int n = z; n < 1235000000; n += 137)
    {
        int x = n, k = 0, sm = 0;
        while (x > 9999)
        {
            k++;
            sm += x % 10;
            x /= 10;
        }
        if (x == 1234 && (n - (int)(1234 * pow(10, k))) % (sm * sm * sm) == 0)
            cout << n << " " << n / 137 << endl;
    }
}

C++ анализ через строки

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int z = 12341;
    while (z % 137 != 0)
        z++;
    for (int n = z; n < 1235000000; n += 137)
    {
        string s = to_string(n);
        if (s.substr(0, 4) == "1234")
        {
            int sm = 0;
            for (int i = 4; i < s.length(); i++)
                sm += (int)s[i] - 48;
            if (stoi(s.substr(4, s.length() - 4)) % (sm * sm * sm) == 0)
                cout << n << " " << n / 137 << endl;
        }
    }
}

Ответ

12340001 90073
123400010 900730
123437000 901000
1234000100 9007300
1234370000 9010000

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

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

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

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