Нахождение prime_factors, который возвращает простые факторы целого числа в виде списка - PullRequest
0 голосов
/ 17 января 2020
def prime_factors(n):
    i = 2
    lst = []
    while i <= n:
        if isprime(i):
            lst.append(i)
        i += 1
    return lst
def isprime(n):
    n = isdivisor(n)
    i = 2
    lst = []
    for j in n:
        while i <= j/2:
            if j % i != 0:
                return True
            else:
                return False
            i += 1
def isdivisor(n):
    i = 2
    lst = []
    while i <= n/2:
        if n % i == 0:
            lst.append(i)
        i += 1
    return lst
print prime_factors(15)

Сначала я попытался найти делители целых чисел n и проверил делители, являются ли они простыми или нет. Однако на выходе получается как-то [10, 14, 15] вместо [3,5]. Это потому, что я не могу выполнить задание n = isdivisor(n) или что-то еще?

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Я только что написал кусок кода, чтобы сделать Это, без использования библиотек. Я надеюсь, что это может помочь вам.


мой код:

def get_square_root(n):
  """Return square root of n."""
  return n ** (1.0 / 2)


def is_divisor(n, d):
  """Return True if n divides d, False otherwise."""
  return n % d == 0


def is_prime(n):
  """Return True if n is prime, False otherwise."""
  limit = int(get_square_root(n))
  for i in range(2, limit+1):
    if is_divisor(n, i):
      return False
  return True


def get_prime_factors(n):
  """Return a list of the prime factors of n."""
  prime_factors = []
  for i in range(2, n):
    if is_divisor(n, i) and is_prime(i):
      prime_factors.append(i)
  return prime_factors


if __name__ == '__main__':
  n = 15  # Change n to test 
  prime_factors = get_prime_factors(n)
  print(prime_factors)

вывод:

[3, 5]
2 голосов
/ 17 января 2020

В вашем коде есть некоторые логические ошибки. Вы несколько усложняете вещи, возвращая списки делителей и простых чисел. У вас уже есть al oop от prime_factors() до go через все числа от 2 до n. Таким образом, вы можете упростить ваши функции isdivisor() и isprime():

def isdivisor(i, n):
    return n % i == 0

def isprime(n):
    i = 2
    while i < n:
        if n % i == 0:
            return False
        i += 1
    return True

Затем измените свой основной l oop в prime_factors() следующим образом:

def prime_factors(n):
    i = 2
    lst = []
    while i < n:
        if isdivisor(i, n) and isprime(i):
            lst.append(i)
        i += 1
    return lst

Вывод:

>>>prime_factors(15)
[3,5]
...