我有一些小软件可以计算每个三角形数的因子数,看看它们中第一个有多于X个因子是什么(是的,这是一个项目问题,number 12, ,虽然我还没有解决它... ...因为我正在尝试使X一些随机值来查看代码的作用以及在多长时间内,我注意到一些奇怪的东西(至少对我来说):直到X = 47执行时间以明显正常的方式增加,但是当X = 48时它比正常情况增加更多,并且函数调用远大于速率,如果我会这样说它会爆炸(爆炸)..为什么会这样做?
代码:
def fac(n):
c=0
for i in range (1,n+1):
if n%i==0:
c=c+1
return c
n=1
while True:
summ=0
for i in range (1,n+1):
summ=summ+i
if fac(summ)>X:
break
n=n+1
print summ
以及分析时:
when X=45 : 314 function calls in 0.027 CPU seconds
when X=46 : 314 function calls in 0.026 CPU seconds
when X=47 : 314 function calls in 0.026 CPU seconds
when X=48 : 674 function calls in 0.233 CPU seconds
when X=49 : 674 function calls in 0.237 CPU seconds
我认为,如果我继续,我会遇到系统调用增加和时间突然增加的其他点,之前有类似的点但是时间太小所以它没那么重要..为什么函数调用突然增加??是不是只想再次为新值调用函数?
P.S。我使用cProfile作为分析器,这里代码中的X
仅用于演示,我直接在代码中写入值...提前谢谢...
答案 0 :(得分:6)
你看过所涉及的实际价值吗?
第一个超过47个因子的三角数是T(104)= 5460,有48个因子。
但是第一个超过48个因子的三角数是T(224)= 25200,其中有90个因子。所以难怪它需要做更多的工作。
如果你的代码最多运行到T( n ),那么它会调用range
2 n 次并且fac
n < / em>次,总共3个 n个函数调用。因此,对于T(104),它需要312个函数调用,而对于T(224),它需要672个函数调用。据推测,在某个地方有2个函数调用,你没有向我们展示,这解释了你得到的分析结果。
您当前的策略不会让您找到Project Euler问题的答案。但我可以给出一些提示。
summ=0
?答案 1 :(得分:3)
如果你检查输出,你会看到执行时间有几个尖峰(突然增加)。
原因是所需的循环次数不是逐渐增加而是突然增加。在n
循环后打印出while True
,您就会看到它。
注意:Euler是数学网站,不写蛮力算法;)