Задания
Версия для печати и копирования в MS Word

Пусть M  — сумма ми­ни­маль­но­го и мак­си­маль­но­го на­ту­раль­ных де­ли­те­лей це­ло­го числа, не счи­тая еди­ни­цы и са­мо­го числа. Если таких де­ли­те­лей у числа нет, то счи­та­ем зна­че­ние M рав­ным нулю.

На­пи­ши­те про­грам­му, ко­то­рая пе­ре­би­ра­ет целые числа, бо́льшие 800 000, в по­ряд­ке воз­рас­та­ния и ищет среди них такие, для ко­то­рых M окан­чи­ва­ет­ся на 4. В от­ве­те за­пи­ши­те в пер­вом столб­це таб­ли­цы пер­вые пять най­ден­ных чисел в по­ряд­ке воз­рас­та­ния, а во вто­ром столб­це  — со­от­вет­ству­ю­щие им зна­че­ния M.

На­при­мер, для числа 20 М  =  2 + 10  =  12.

Ко­ли­че­ство строк в таб­ли­це для от­ве­та из­бы­точ­но.

Ответ:

ИЛИ

Назовём мас­кой числа по­сле­до­ва­тель­ность цифр, в ко­то­рой также могут встре­чать­ся сле­ду­ю­щие сим­во­лы:

—  сим­вол «?» озна­ча­ет ровно одну про­из­воль­ную цифру;

—  сим­вол «*» озна­ча­ет любую по­сле­до­ва­тель­ность цифр про­из­воль­ной длины; в том числе «*» может за­да­вать и пу­стую по­сле­до­ва­тель­ность.

На­при­мер, маске 123*4?5 со­от­вет­ству­ют числа 123405 и 12300405.

Среди на­ту­раль­ных чисел, не пре­вы­ша­ю­щих 1010, най­ди­те все числа, со­от­вет­ству­ю­щие маске 3?12?14*5, де­ля­щи­е­ся на 1917 без остат­ка. В от­ве­те за­пи­ши­те в пер­вом столб­це таб­ли­цы все най­ден­ные числа в по­ряд­ке воз­рас­та­ния, а во вто­ром столб­це  — со­от­вет­ству­ю­щие им ре­зуль­та­ты де­ле­ния этих чисел на 1917.

Ко­ли­че­ство строк в таб­ли­це для от­ве­та из­бы­точ­но.

Ответ:

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

def deliteli(n):

deliteli = []

for i in range(2, int(n**0.5)+1):

if n % i == 0:

deliteli.append(i)

deliteli.append(n//i)

return deliteli

 

count = 0

for j in range(800_000, 10**6):

d = deliteli(j)

if len(d) != 0:

M = max(d) + min(d)

if M % 10 == 4:

print(j, M)

count += 1

if count == 5:

break

 

Ответ:

800004 400004

800009 114294

800013 266674

800024 400014

800033 61554

 

При­ведём ре­ше­ние Алек­сандра Коз­ло­ва на языке Python.

def get_M(n):

mi = ma = None

for i in range(2, int(n**0.5) + 1):

if n % i == 0:

if mi is None: mi = i

if ma is None or (n // i) > ma: ma = n // i

return 0 if mi is None else mi + ma

results = []

for n in range(800_001, 1_000_000):

M = get_M(n)

if M % 10 == 4:

results.append((n, M))

if len(results) == 5: break

for num, M in results:

print(f"{num}\t{M}")

ИЛИ

Будем по­сле­до­ва­тель­но рас­смат­ри­вать каж­дое целое число, крат­ное 1917, затем каж­дое число про­ве­рять на со­от­вет­ствие маске.

 

При­ведём ре­ше­ние на языке Python.

from fnmatch import *

for x in range(0, 10**10, 1917):

# Пе­ре­би­ра­ем все числа от 0 с шагом 1917, будут по­лу­че­ны числа крат­ные 1917

if fnmatch(str(x), '3?12?14*5'):

# Про­ве­ря­ем по­лу­чен­ное число со­от­вет­ствию за­да­нию

print(x, x//1917)

 

В ре­зуль­та­те ра­бо­ты про­грам­ма долж­на вы­ве­сти сле­ду­ю­щее:

351261495 183235

3212614035 1675855

3412614645 1780185

3712414275 1936575

3912414885 2040905

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

from itertools import product

d='0123456789'

twod=[''.join(x) for dl in range(3) for x in product(d,repeat=dl)]

a=sorted([int(f'3{x}12{y}14{z}5') for x in d for y in d for z in twod])

for y in [x for x in a if x%1917==0]: print(y,y//1917)

Источники: