Не работает код на python

class Human:
    n = 600851475143 # Делимое
    s = 2  # Делитель

    def DgunLi(self):  # Проверяет делится ли число на n или нет
        if self.n % self.s == 0: # Проверяет делится ли число на n или нет
            print(self.s)  # Выводит значения s которое нечетное и делится на n
            self.s += 1 # Добавляет один чтобы запуск шёл процесс дальше
            self.xiao()  # Перекидавает на фунцию xiao()
        else:
            self.s += 1 # Добавляет один если не делится
            self.xiao()   # Перекидавает на на функцию xiao()

    def xiao(self):   # Первоначальная фунция которая проверяет чётное число или нет
        running = True
        while running:
            if self.n % self.s == 1: # Проверяет четное число или нет
                running = False
                self.DgunLi()   # Даёт доступ к другой функции
            else:
                self.s =+ 1 # Добавляет 1 к числу  s чтобы оно нашло нечетное

Human().xiao()  # Вызываю класс Human() и вызываю функцию xiao()

Вот хочу решить 3 задачу эйлера- https://euler.jakumo.org/problems/view/3.html . Хотел зделать так: Есть две функции,вторая проверяет четное число или нет,если нет то добавляет один и по кругу если нечетное то даёт доступ к первой функции. Первая функция проверяет делится ли число на делимое или нет если нет добавляет один и перенаправляем на вторую функцию,если делится на делитель выводит на экран добавляет на один и перенаправляет на вторую функцию.Почему он не работает?

введите сюда описание изображения

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Namerek
val = 600851475143

divider = int(val ** 0.5) + 1


def is_prime(item: int):
    return len(list(filter(lambda x: item % x == 0, range(2, item + 1)))) == 1


while divider - 1:
    divider -= 1
    if (val % divider) == 0 and is_prime(divider):
        break

print(divider, int(val / divider), val % divider, sep='\n')
# 6857
# 87625999
# 0

Можно еще вот так:

from itertools import dropwhile


def is_prime(item: int):
    return len(list(filter(lambda x: item % x == 0, range(2, item + 1)))) == 1

val = 600851475143
div = iter(range(int(val ** 0.5) + 1, 2, -1))
max_divider, *_ = dropwhile(lambda x: not ((val % x) == 0 and is_prime(x)), div)

print(max_divider)
# 6857

→ Ссылка