首页 > 解决方案 > 素数分解器引发意外的 TypeError-py3

问题描述

我正在制作一个对数字进行素数分解的函数。然而,它没有做它应该做的,而是引发了一个奇怪的 TypeError。

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

我的(白痴)逻辑告诉我“浮动”对象与我的代码无关。我只是不明白。对我的代码的任何更正将不胜感激

标签: python-3.x

解决方案


您的代码有问题

  • 不包括 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))

推荐阅读