Pascal的三角形表达式未产生正确的输出

时间:2019-11-21 18:31:36

标签: python python-3.x

我正在寻找有关为Euler项目148问题编写的代码的帮助。

问题如下:

在Pascal三角形的前十亿行中查找不能被7整除的条目数。

我知道,这种特定方法将无法正常工作-当以1000000000运行时-会导致溢出错误。

无论如何,我很好奇为什么此代码不起作用:

我使用表达式((math.factorial(r))/((math.factorial(t))*(math.factorial((r-t)))))在给定的行和术语中查找术语的值,如公式所示:

formula

当numrows == 7时,脚本应打印0。

当数字== 100时,脚本应打印2361,而我的代码将打印3139。

代码如下:

import math

numrows = 100
count = 0

for r in range(numrows):
  for t in range(r):
    if not (((math.factorial(r))/((math.factorial(t))*(math.factorial((r-t))))) % 7 == 0):
      count += 1
print(count)

1 个答案:

答案 0 :(得分:2)

您使用浮点除法import numpy as np from gekko import GEKKO xm = np.array([0, 1, 2, 3, 4, 5]) ym = np.array([0.1, 0.2, 0.3, 0.5, 1.0, 0.9]) m = GEKKO() m.x = m.Param(value=np.linspace(-1, 6)) m.y = m.Var() m.options.IMODE = 2 m.cspline(m.x, m.y, xm, ym) m.solve(disp=False) p = GEKKO() p.x = p.Var(value=1, lb=0, ub=5) p.y = p.Var() p.cspline(p.x, p.y, xm, ym) p.Obj(-p.y) p.solve(disp=False) 而不是整数除法'//'错误地实现了公式。更改为

/

您将获得输出 if not math.factorial(r)//(math.factorial(t)*math.factorial(r-t)) % 7 == 0: 。 (是的,我删除了多余的括号。)

使用小数字,您可以在浮点算术中获得准确的结果,因此您的模运算将获得所需的结果。但是,当您到达较低的行时,就会遇到浮点精度的限制-除法的结果将不是精确 2261,而您的{{ 1}}比较失败。因此,您计算了很多不符合条件的单元格。

最后,添加blahblah.0个修复程序:

== 0

...,您会得到Thierry's


请注意,此嵌套循环不会在合理的时间内解决问题。您需要通过除数分析来解决这个问题:分子和分母中有7个因子?如果分子更多,则结果可被7整除。

将n的截断商for t in range(r+1): 从1到2361。对r / 7^nr log 7执行相同的操作。您还可以在迭代所需值时将运行计数调整为7秒。