gpt4 book ai didi

python - 我对 Project Euler #12 的 python 解决方案有什么问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:29 28 4
gpt4 key购买 nike

可能剧透警告

我花了很长时间试图改进这个算法并找出问题所在,但我似乎无法弄清楚为什么输出的答案不正确。

我正在尝试解决 Project Euler #12 , 以获得除数超过 500 的最小三角数,但它说我的答案不正确。

这是我的 Python 代码:

import time

# function to get the number of divisors
def div(n):
d=2
for i in range(2,int(n**.5)+2):
if (n % i) == 0:
d += 1
return d

start = time.time()

w = True
n=m=1
while w:
n += 1
s = (n*(n+1))/2 # nth triangle number
r = div(s)
if r > m:
m = r
print s,"has",r,"divisors"
if r > 500:
w = False

print "Solved in",((time.time()-start)*1000),"milliseconds"

该代码的输出是这样的(在 66 秒内):

3 has 2 divisors
6 has 4 divisors
36 has 6 divisors
120 has 9 divisors

...

76576500 has 289 divisors
103672800 has 325 divisors
236215980 has 385 divisors
842161320 has 513 divisors
Solved in 65505.5799484 milliseconds

但是,如果我在 Project Euler 问题中输入 842161320,它会说它不正确。

我做错了什么?

最佳答案

我看到两个错误:

  • 您的 div 函数被破坏:div(24) == 5,而它应该是 8
  • 你的第一个三角数是 3,尽管它应该是 1

您可以像这样实现一个有效的 div:

import math
def divisors(n):
return sum(1 for x in range(1, n+1) if n % x == 0)

此外,该代码非常低效,一些改进它的建议是:

不要使用您的公式计算第 n 个三角数,而是使用滚动总和:

import itertools

s = 0
for i in itertools.count(1):
s += i
if div(s) > 500:
print s
break

此外,使用 prime factors to calculate the number of divisors .您可以创建素数缓存以获得最佳性能。

关于python - 我对 Project Euler #12 的 python 解决方案有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9182462/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com