【问题标题】:Python - Counting how many factors a number hasPython - 计算一个数字有多少个因子
【发布时间】:2018-10-07 23:46:09
【问题描述】:

我一直在尝试制作一个看起来像这样的“质数检查器”:

请输入一个数字:7

因素是:

1

7

7 是质数

再试一次?是的

输入一个数字:6

因素是:

1

2

3

6

6 不是质数

它有6个因素

我被困在最后一部分,它计算非质数有多少因子(在下面的代码中列为“num_factors”)。谢谢! *为清晰起见进行了编辑。

def main():
    num = int(input("Please enter an integer between 2 and 5,000: "))

    def list_factors(x):
        print("The factors of your number are: ")
        for i in range(1, x + 1):
                if x % i == 0:
                    print(i)
    list_factors(num)

    def is_prime(num):
        if num>1:
            for i in range(2,num):
                if (num%i) == 0:
                    print(num, "is NOT a prime number")
                    break
            else:
                print(num, "is a prime number")

        else:
            print(num, "is not a prime number")
    is_prime(num)

    def num_factors(x):
        for i in range(1, x + 1):
                if x % i == 0:
                    list = []
                    print("It has", len(list), "factors")
    num_factors(x)


    print()
    again=input("Try again? (y/n): ")
    if again == "y":
        print()
        main()
    else:
        print("Bye!") 

if __name__ == "__main__":
    main()

【问题讨论】:

  • 我认为你的第一个例子应该说 7 一个素数。
  • 创建返回结果的函数。从函数外部打印结果。一旦你解决了这个问题,剩下的就很容易了。

标签: python list primes


【解决方案1】:

我建议你先建立一个因素列表,而不是在每一步都迭代。

def get_factors(n):
    factors = []
    for i in range(1, n+1):
        if n % i == 0:
            factors.append(i)
    return factors

现在您可以根据因子列表定义其他函数:

def is_prime(factors):
    return len(factors) == 2

def num_factors(factors):
    return len(factors)

如果你想让你的实现更高效,我建议你阅读素数分解。

【讨论】:

  • 你只需要n//2 +1
  • @JoranBeasley 这具有相同的时间复杂度,所以这是一个毫无意义的优化。如果您想提高效率,您可以迭代到n 的平方根,并为找到的每个因子添加它的补码。或者,正如我所提到的,只需计算质因数/指数并使用它们。
【解决方案2】:
a=int(input("Enter number: "))
k=0
for i in range(2,a//2+1):
    if(a%i==0):
        k=k+1
if(k<=0):
    print("Number is prime")
else:
    print("Number isn't prime") 

【讨论】:

  • 为帮助读者理解您的解决方案,请考虑包含对您的代码的简短描述以及它如何解决发布的问题
【解决方案3】:

改变

def num_factors(x):
    for i in range(1, x + 1):
            if x % i == 0:
                list = []
                print("It has", len(list), "factors")
num_factors(x)

def num_factors(x):
    list = []
    for i in range(1, x + 1):
            if x % i == 0:
                list.append(x)      
    print("It has", len(list), "factors")
num_factors(num)

你的号码叫num,而不是x。然后您应该在 for 循环之外创建因子列表并将每个因子附加到列表中。

正如 cmets 中有人建议的那样,您应该在函数之外进行打印。此外,您不需要检查大于x//2 的因素。所以我会推荐这样的东西:

def num_factors(x):
    list = []
    for i in range(1, x//2 + 1):
            if x % i == 0:
                list.append(x)      
    return facts
facts=num_factors(num)
print("It has", len(facts), "factors")

【讨论】:

    【解决方案4】:

    您非常接近,唯一的调整是您希望附加那些通过 if x % i == 0 的值,也可以声明为 if not x % i:,并且您希望将空列表移到循环之外。然后只返回该列表的长度。

    def num_factors(non_prime):
        l = []
        for i in range(1, non_prime+1):
            if not non_prime % i:
                l.append(i)
        return len(l)
    
    print('It has {} factors'.format(num_factors(10)))
    # It has 4 factors.
    

    未来参考

    只是为了让您了解为什么探索内置函数很重要,您可以在一个表达式中使用 filter 来完成此操作

    def num_factors(non_prime):
        return len(list(filter(lambda x: not non_prime % x, range(1, non_prime +1))))
    

    以及列表理解

    def num_factors(non_prime):
        return len([i for i in range(1, non_prime +1) if not non_prime % i])
    

    您可以在https://docs.python.org/3/找到这两个方面的信息

    【讨论】:

      【解决方案5】:
      # input and validation integer number
      try:
          num = int(input(
              "Please enter an integer number between 2 and 5,000 : "))
      except ValueError:
          print("Please enter an integer number between 2 and 5,000!!!")
      
      # for check number.
      # If number is prime it's true
      # If number not prime it's false 
      # default is true
      status = True
      
      print("%d divided by %d" % (num, 1))
      for i in range(2, int(num / 2)+1):
          if num % i == 0:
              status = False
              print("%d divided by %d" % (num, i))
      print("%d divided by %d" % (num, num))
      
      
      if status:
          print("%d is prime" % (num))
      else:
          print("%d is not prime" % (num))
      

      【讨论】:

        【解决方案6】:

        如果您想捕获所有因素,可以使用下面的子项。如果你给它一个像 1024 这样的数字,它会返回一个包含 10 个 2(所有因子)的列表

        def main():
            x = int(input('Enter a number to find the prime factors '))
        
            primes = prime_factors(x)
        
            print(primes)
        
        def prime_factors(x):
            factors = []
        
            y = 2
        
            while (y <= x):
                while x % y != 0:
                    y += 1
                x /= y
                factors.append(y)
        
            return factors
        
        main()
        

        【讨论】:

          猜你喜欢
          • 2021-05-12
          • 2013-11-01
          • 2016-02-06
          • 2019-02-16
          • 1970-01-01
          • 2019-11-03
          • 2014-11-24
          • 2022-10-15
          • 1970-01-01
          相关资源
          最近更新 更多