Нужна помощь в оформлении кода

Roodger

Новичок
Пользователь
Авг 20, 2020
15
4
3
Добрый день всем
Четвертый день бъюсь над задачей № 47 проекта Эйлера http://euler.jakumo.org/problems/view/47.html
Код сделал, он считает и эти 4 числа он находит:

Python:
def primfacs(t):

    quan = []
    for n in range(3, t):
        i = 2
        primfac = []

        n1 = n
        while i * i <= n:
            while n % i == 0:
                primfac.append(i)
                n = int(n / i)
            i = i + 1
        if n > 1:
            primfac.append(n)
        if len(set(primfac)) == 4:
            quan.append(n1)



    res = []
    for i in range(1, len(quan) - 1):

        if quan[i + 1] - quan[i] == 1 and quan[i + 2] - quan[i + 1] == 1 and quan[i + 3] - quan[i + 2] == 1:
            res.append(quan[i])
            res.append(quan[i + 1])
            res.append(quan[i + 2])
            res.append(quan[i + 3])

            print(f'res=', res)

            break
        else:
            res = []

primfacs(1000000)

Здесь в первой части кода мы находим простые множители чисел из ряда (1, t) и те числа, у которых по 4 множителя записываем в отдельный список
Во второй части проверяем эти числа на последовательность 4 подряд идущих чисел

Но получился этот код некрасивым и не универсальным. Во-первых, не получилось у меня сделать так, чтобы он сам создавал ряд чисел, среди которых надо искать. Из за этого пришлось задавать ряд вручную, что привело к лишним вычислениям

И еще обнаружил, что нет проверки уникальности множителей

И так как тут повторяющиеся операции, попытался все оформить в декоратор, но не получилось

Не могли бы вы предложить правильно оформленное решение или ссылку на него дать, а то что то я его не нашел
 

alext

Популярный
Пользователь
Май 10, 2020
288
66
28
Python:
import math

def reduce_repetitive(n, i, factors):
    while n % i == 0:
        factors.append(i)
        n /= i
    return n

def prime_factors(n):
    factors = []
    n = reduce_repetitive(n, 2, factors)
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        n = reduce_repetitive(n, i, factors)
    if n > 2:
        factors.append(int(n))
    return factors

def find_consecutive(n, limit=1_000_000, start=14):
    numbers = []
    for x in range(start, limit):
        if len(set(prime_factors(x))) == n:
            if not numbers or numbers[-1] == x - 1:
                numbers.append(x)
                if len(numbers) == n:
                    return numbers
            else:
                numbers = []

#########

for n in range(2, 5):
    print(find_consecutive(n))
    
# [14, 15]
# [644, 645, 646]
# [259368, 259369, 259370, 259371]
 
  • Мне нравится
Реакции: Roodger

Форум IT Специалистов