【问题标题】:Counting how many factors an integer has计算一个整数有多少个因数
【发布时间】:2021-05-12 10:56:18
【问题描述】:

所以我编写了一个函数来确定一个数字有多少个因子并列出该数字。但是我的功能没有输出正确的信息。

def num_factors(integer):
    result = 0
    for i in range(1,integer+1):
        if integer%i == 0:
            result +=1
    return result

print(num_factors(5))
print(num_factors(6))
print(num_factors(97))
print(num_factors(105))
print(num_factors(999))

由于某种原因它正在输出:

2
4
2
8
8

什么时候应该输出:

0
2
0
6
6

【问题讨论】:

  • 您的循环不需要一直到integer 来查找所有因子,而只需到它的平方根math.floor(integer**0.5)。但是你需要稍微改变一下你的算法
  • 也是正确的。素数由正好有 2 个分隔符来定义
  • 你也在测试integer / 1,这将永远是真的
  • 5其实可以被1和5整除。为什么说答案2是错的呢?
  • 它返回了正确的输出。如果您不想将 1 和数字本身作为因子包含在内,请从 2 循环到整数。

标签: python factors


【解决方案1】:

使用for i in range(1,integer+1): 行,您将遍历 1 和您的整数之间的所有数字,包括 1 和您的整数,这当然是因数。

例如,如果integer = 5,您将循环遍历 1、2、3、4 和 5。在这 1 和 5 中,当然都是 5 的因数。

您可以将行编辑为for i in range(2,integer): 以修复错误。生成的代码如下所示:

def num_factors(integer):
    result = 0
    for i in range(2,integer):
        if integer%i == 0:
            result +=1
    return result

print(num_factors(5))
print(num_factors(6))
print(num_factors(97))
print(num_factors(105))
print(num_factors(999))

尽管正如 cmets 中的某人所建议的那样,您可以进一步减少搜索空间。

【讨论】:

    【解决方案2】:

    sympy 提供了这个函数来查找素因数。

    >>> from sympy.ntheory import factorint
    >>> factorint(6008)   # 6008 = (2**3) * (751**1)
    {2: 3, 751: 1}
    

    【讨论】:

      【解决方案3】:

      问题是您计算除以 1 和测试整数本身。

      您需要减去 2 或跳过 1integer 以获得所需的输出:

      def num_factors(integer):
          result = 0
          for i in range(2,integer): # skips 1 and integer...
              if integer%i == 0:
                  result +=1
          return result
      

      更好是意识到对于每个 x * yinteger 的一个因子,我们只需要找到其中一个(即,162,@ 987654329@, 和 8 作为因子。计数 2 两次 (2 x 8=16) 和 4 一次 (4 x 4=16)) 因为 1 将小于或等于 integer 的平方根,所以只需循环到integer 的平方根,并增加 2 而不是 1,并且只进行一小部分测试(并使结果快 1000 倍):

      def num_factors(integer):
          result = 0
          stop=int(float(integer)**0.5)
          for i in range(2,stop+1):
              if integer%i == 0:
                  result +=2
          if stop*stop==integer: result-=1    
          return result
      
      for x in (5,6,97,105,999):
          print(f'{x}: {num_factors(x)}')
      

      打印:

      5: 0
      6: 2
      97: 0
      105: 6
      999: 6
      

      顺便说一句:实际上,customary1 和整数本身作为因子计算。所以所有这些结果应该是 +2 并且您的原始解决方案实际上是正确的。要使上述解决方案正确,只需从result=2开始

      【讨论】:

        【解决方案4】:

        我会这样做:

        def num_factors(integer):
            for i in range(1, integer, 1):
                if integer % i == 0:
                    print(i)
        
        print(num_factors(5))
        print(num_factors(6))
        print(num_factors(97))
        print(num_factors(105))
        print(num_factors(999))
        

        【讨论】:

          【解决方案5】:

          试试这个:

          num_factors=lambda integer : len([e  for e in range(1,integer) if integer%e==0 and e not in [1,integer]])
          
          
          
          print(num_factors(5))
          print(num_factors(6))
          print(num_factors(97))
          print(num_factors(105))
          print(num_factors(999))
          

          【讨论】:

            【解决方案6】:

            好的,这不是您现在要问的问题,但可能是您的下一个问题。如果您的整数很小,您的算法可以正常工作,但是当您的整数很大时呢?假设integer = 1_200_000_000?

            你需要找到整数的素因数分解:

            integer = p1**q1 * p2**q2 * p3**q3 * .....
            

            而因子的个数(包括1和整数本身)是

            (q1 + 1)(q2 + 1)(q3 + 1)....
            

            由于1,200,000,000 = (2**10)(3**1)(5**8),因子个数为(11 * 2 * 8) = 176.

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-11-01
              • 2019-02-16
              • 1970-01-01
              • 2018-04-12
              • 1970-01-01
              • 2022-07-01
              • 1970-01-01
              相关资源
              最近更新 更多