[英]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
的素数因子分解,就把它保存在缓存中(我使用从n
到dict
的dict
映射,它本身从素数映射到它出现的次数)。 当被要求计算给定数字的素数因子集时,首先检查缓存,然后从2开始扫描以查看是否可以找到第一个因子。 然后用n
除以第一个因子等递归调用函数。
为了找到n的素数因子,没有必要达到n,你可以在sqrt(n)
处停止
寻找质因子(当k
在你的函数Nfactor(..)
可以查看k=2
, k=3
(即如果2分n
,如果3个分歧n
等),然后递增k
中的2个步骤(只k=2
后测试k
奇数值
如上面的评论中所述,以a=1
开头并使用range(1,10**6)
代替i
我的解决方案中没有使用; 通过使用我最喜欢的搜索引擎找到:
i'th
三角形数是a = i * (i+1) / 2
因此你可以组合i
和i+1
的素因子(去掉一次出现的2
)。 由于i
和i+1
不共享任何共同的素因子,你甚至可以从i
和i+1
的除数中得出a
的除数。 一些想法......
您列出的是素数,但不是他们的产品。 在定义中,对于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.