Задача 6516. Источник: Поляков. Задание КИМ 25
(А. Богданов) Назовём маской числа последовательность цифр, в которой может встречаться символ «#», означающий любое число, которое делится без остатка на куб суммы своих цифр. Среди натуральных чисел, не превышающих 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