Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [15374; 55166] пары чисел с одинаковой суммой цифр чисел и одинаковой суммой чисел их делителей. В ответ запишите количество таких пар и через пробел значение суммы цифр чисел, с которой больше всего встречается таких пар.
Первый способ решения
sd = []
for i in range(15374, 55166+1):
c = set()
for j in range(1, int(i ** 0.5) + 1):
if i % j == 0:
c.add(j)
c.add(i // j)
t1 = sum([int(k) for k in str(i)])
t2 = sum(c)
sd.append([t1, t2])
sp = sorted(sd, key=lambda x: [x[0], x[1]])
current_c = 0
c = last = mx = 0
for i in range(len(sp)-1):
if sp[i][0] == sp[i+1][0] and sp[i][1] == sp[i+1][1]:
current_c += 1
c += current_c
if current_c > mx:
last = sp[i][0]
mx = current_c
else:
current_c = 0
print(c, last)
Второй способ решения
def divs(x): # функция, которая возвращает отсортированный список делителей числа
d = set() # Множество для хранения делителей
for i in range(1,int(x**0.5)+1):
if x % i == 0:
# Добавляем делитель и парный ему в множество
d |= {i,x//i}
return sorted(d) # Возвращаем отсортированный список делителей числа x
d = [[] for i in range(41)]#двумерный массив,
# в котором мы будем хранить суммы делителей чисел в определенной ячейке,
# исходя из суммы цифр самого числа, количество ячеек 41, так как
# максимальная сумма цифр у числа 49999 и она равна 40
for x in range(15374,55167):
sm = sum(map(int,str(x)))#считаем сумму цифр числа
sum_divs = sum(divs(x))#считаем сумму делителей числа
d[sm].append(sum_divs)#складываем в определенную ячейку сумму делителей
count = {x:0 for x in range(41)}#словарь, у которого в качестве ключа числа от 0 до 41,
#в качестве значения будет количество подходящих пар.
#пример, 13:5 - это означает, что есть 5 пар среди чисел, у которых сумма цифр равна 13
for i in range(len(d)):#проход по двумерному списку
if len(d[i]) > 1:#если возможно составить пару
for j in range(len(d[i])-1):#перебираем всевозможные пары в списке
for k in range(j+1,len(d[i])):
if d[i][j] == d[i][k]:#если суммы делителей равны
count[i] += 1#то увеличиваем счётчик под индексом i,
# который обозначает чему равна сумма цифр чисел в этом списке
#вывод количества таких пар и значения суммы цифр, для которой собралось больше всего таких пар
print(sum(count.values()),*[x for x in count.keys() if count[x] == max(count.values())])