Простой факторизатор вызывает неожиданную ошибку типа-py3

#python-3.x

#python-3.x

Вопрос:

Я создаю функцию, которая разлагает число на простые множители. Однако вместо того, чтобы делать то, что должно, он вызывает странную ошибку типа.

 def isprime(num):
    if num > 1:
    # check for factors
       for i in range(2,num):
          if num%i==0:
              return False
              break
          else:
              return True
     else:
        return False
def primes(no):
   nolist=[]
   for a in range(1,(no 1)):
       if isprime(a)==True:
          nolist.append(a)
   return nolist
def factors(b):
   Lst=[]
   while True:
      for prime in primes(b):
          if b%prime==0:
              b=b/prime
              Lst.append(b)
              if b==1:
                 break
   return Lst
factors(6)
  

Вызывает странную ошибку типа:

 Traceback (most recent call last):
File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 31, in <module>
start(fakepyfile,mainpyfile)
File "/data/user/0/ru.iiec.pydroid3/files/accomp_files/iiec_run/iiec_run.py", line 30, in start
 
exec (open(mainpyfile).read(), __main__.__dict__)
File "<string>", line 71, in <module>
File "<string>", line 64, in factors
File "<string>", line 58, in primes
TypeError: 'float' object cannot be interpreted as an integer
  

Моя (идиотская) логика подсказывает мне, что объект ‘float’ не имеет никакого отношения к моему коду. Я просто не понимаю. Любые исправления в моем коде будут высоко оценены

Комментарии:

1. В функции factors ваш цикл for primes(b) принимает значение с плавающей запятой на второй итерации, потому что b=b/prime

2. Что мне делать вместо этого?

3. Я добавил ответ со всеми объяснениями,

Ответ №1:

Проблемы с вашим кодом

  • Список простых чисел, не включающий 2. ( isprime функция неверна)
  • Вы вызываете primes функцию снова и снова. Не требуется
  • При делении b/prime он возвращается float
  • Вы добавляете b в список простых множителей Lst вместо prime

Найти число простое или нет

 def isprime(num):
  if num > 1:
    for i in range(2,num):
      if num%i==0:
          return False
    else:
        return False
  

Полный код

 def isprime(num):
  if num > 1:
  # check for factors
    for i in range(2,num):
      if num%i==0:
          return False
    else:
        return True

def primes(no):
   nolist=[]
   print(type(no))
   for a in range(1,(no 1)):
       if isprime(a)==True:
          nolist.append(a)
   return nolist
def factors(b):
   Lst=[]
   prime_nums = primes(b)
   while True:
      for prime in prime_nums:
          if b%prime==0:
              b=b//prime
              Lst.append(prime)
              break
      if b==1:
          break
   return Lst
print(factors(6))