Skip to content

Instantly share code, notes, and snippets.

@unilecs
Last active January 15, 2019 05:56
Show Gist options
  • Save unilecs/a86723c109aabbc9c0663ac5080cb190 to your computer and use it in GitHub Desktop.
Save unilecs/a86723c109aabbc9c0663ac5080cb190 to your computer and use it in GitHub Desktop.
Задача 151: Числа Смита (@jinxonik)
""" Метод расчёта с использованием строк """
# Получить следующее число Смита после n
def next_smith_number(n):
from itertools import count
# Получить в виде кортежа список простых сомножителей числа n в виде строки и кол-во сомножителей
def primes_str(n):
s, i, c = "", 2, 0
while i*i <= n:
while n % i == 0:
s += str(i)
c += 1
n //= i
i += 1
if n > 1:
s += str(n)
c += 1
return s, c
# Получить сумму цифр строки s
def digsum(s):
return sum(map(int, s))
# Цикл от n+1 до успешного решения
for x in count(n+1):
# Получаем строку цифр простых сомножителей и кол-во сомножителей
prime_str, prime_count = primes_str(x)
if prime_count > 1: # если кол-во > 1 (т.е. число не является простым)
# и сумма цифр числа x равна сумме сумм :) цифр простых сомножителей числа x...
if digsum(str(x)) == digsum(prime_str):
return x # возвращаем значение, если суммы совпадают
################################################################################
n = 4937775 # исходное число
for i in range(3): # кол-во искомых чисел
n = next_smith_number(n) # находим следующее значение
print(n) # выводим его
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment