繁体   English   中英

Euler#12,我的Python程序出了什么问题?

[英]Euler#12, what's wrong with my Python program?

第12个问题是:

通过添加自然数来生成三角数的序列。 所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个术语是:

1,3,6,10,15,21,28,36,45,55 ......

让我们列出前七个三角形数字的因子:

1:1 3:1,3 6:1,2,3,6 10:1,2,5,10 15:1,3,5,15 21:1,3,7,21 28:1,2, 4,7,14,28我们可以看到28是第一个超过五个除数的三角形数。

拥有超过500个除数的第一个三角形数的值是多少?


我在Python 3.4中的程序

def Nfactor(n):
    k=2
    c=0
    while k<=n:
        if n%k==0:
          n=n//k
          c+=1
        else:
            k=k+1       
    return c

a=1    
for i in range(10**6):
    a+=i
    if Nfactor(a)>=500:
        print(a)
        break

我等了10多分钟才得到答案。 而对于我自己的我的程序并不是太糟糕,必须在几秒钟内运行..好吧它让我发疯大声笑我没有发现我的错误。

你能帮我吗?

先感谢您 !


编辑

我的解决方案:

import math

def Nfactor(n):
    if n==1:
        return 1
    else:
        c=0

        for i in range(1, int(math.sqrt(n)+1)):
            if n%i==0:
                c+=1
        return c*2

a=0    
for i in range(1,10**6):
    a+=i
    if Nfactor(a)>=500:
        print(a)
        break

您很可能无法获得任何输出。

你的最后的值a是499999500001而其数量最少NFactor(..)为500,为2 ^ 500是3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376


一些提示(我有一个工作示例,现在运行不到一秒钟,但我想在这里发布它将是一个扰流板):

  • 正如另一个(删除的)答案指出的那样,给定一个数的素因子的计数,一个数的除数的数量是(每个素因子的数加1)的乘积,即如果素数因子p出现N次,你可以从0到p^N构建N+1产品,并结合素数的不同幂。

  • 正如@NightShadeQueen指出的那样,一旦你计算了数字n的素数因子分解,就把它保存在缓存中(我使用从ndictdict映射,它本身从素数映射到它出现的次数)。 当被要求计算给定数字的素数因子集时,首先检查缓存,然后从2开始扫描以查看是否可以找到第一个因子。 然后用n除以第一个因子等递归调用函数。

  • 为了找到n的素数因子,没有必要达到n,你可以在sqrt(n)处停止

  • 寻找质因子(当k在你的函数Nfactor(..)可以查看k=2k=3 (即如果2分n ,如果3个分歧n等),然后递增k中的2个步骤(只k=2后测试k奇数值

  • 如上面的评论中所述,以a=1开头并使用range(1,10**6)代替i

我的解决方案中没有使用; 通过使用我最喜欢的搜索引擎找到:

  • i'th三角形数是a = i * (i+1) / 2因此你可以组合ii+1的素因子(去掉一次出现的2 )。 由于ii+1不共享任何共同的素因子,你甚至可以从ii+1的除数中得出a的除数。

一些想法......

  1. 如果我读得正确,你就可以有效地测试从2到n的每个数字n。 你应该能够只测试sqrt(n)。 (更新:道歉,我没有想清楚......它需要是n / 2,而不是sqrt(n)。对素性的测试只需要sqrt(n)。)
  2. 在python shell中运行2 ** 500。 我想你会发现你的测试结果还不够高。 :-)
  3. 也许降低...用较少的因素测试你的方法?

您列出的是素数,但不是他们的产品。 在定义中,对于28,你有7,14和28,在你的函数中你只计算数字7。

所以Nfactor,按照要求这样做,应该是这样的:

def Nfactor(n):
    k=2
    c=2
    while k<n:
        if n%k == 0:
            c+=1
        k=k+1       
    return c

但是有一个非常快的方法来获得这些因素(感谢这个页面 ):

from math import sqrt
def Nfactor(n):
    factors = set()
    for x in range(1, int(sqrt(n)) + 1):
        if n % x == 0:
            factors.add(x)
            factors.add(n//x)
     return len(factors)

此外,您没有按照说明进行操作。 您不会将搜索限制为由后续术语总和(1,1 + 2,1 + 2 + 3,1 + 2 + 3 + 4等)定义的数字,而是对每个数字进行测试( for i in range(10**6):

要获得这些数字,您可以使用这样的generator (请参阅此处 ):

def gen():
    counter = 1
    total = 0
    while True:
        total += counter
        yield total
        counter += 1

然后,你可以这样做来找到你想要的号码:

g = gen()
for n in g:
    if Nfactor(n) > 500:
        print(n)
        break
import math
num=2
i=3
def is_notprime(num):
    j=3
    flag=int(math.sqrt(num))   
    while((j<=flag and num>=3)):    
      if num%j==0:    
        return True
        break
      else:
        j=j+2
def check_div(num):
  temp=1
  a=i
  if(num%2==0 and num>1):
    while(num%2==0):
        num=num/2
        temp+=1
  for j in range(3,int((num+5)/2),2):
    count=1
    if((is_notprime(num) and num>1) or num==j):
      while num%j==0:
        num=num/j
        count+=1
    elif num>1:
      temp=temp*2
      break

    temp=temp*count
  print("divisor is and  %d ans is %d" %(temp,a))
  return(temp)
while(i>=1):
  if(check_div(i)>5):
    break
  num+=1
  i=num*(num+1)/2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM