Python 帕斯卡';s三角形表达式未产生正确的输出

Python 帕斯卡';s三角形表达式未产生正确的输出,python,python-3.x,Python,Python 3.x,我正在寻找一些我为项目Euler问题148编写的代码的帮助 问题如下: 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) 在帕斯卡三角形

我正在寻找一些我为项目Euler问题148编写的代码的帮助

问题如下:

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)

在帕斯卡三角形的前10亿行中找出不能被7整除的条目数

我知道这个特定的方法将无法工作,因为它将在使用100000000运行时导致溢出错误

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

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

当numrows==7时,脚本应该打印0,它会这样做

当numrows==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)


您错误地实现了该公式,使用了浮点除法
/
,而不是整数除法'/'。换成

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

对于较小的数字,您可以在浮点运算中获得精确的结果,因此您的模运算可以产生所需的结果。但是,当您到达较低的行时,您会遇到浮点精度的限制--除法的结果不会完全是
blahblah.0
,并且您的
==0
比较失败。因此,您计算了相当多与您的标准不匹配的单元格

最后,添加Thierry的repair:

for t in range(r+1):
。。。您可以根据需要获得
2361


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


对于从1到
r日志7的n,使用
r/7^n
的截断商。对
t
t-r
执行相同的操作。您还可以在迭代所需值时调整7秒的运行计数。

您错误地实现了公式,使用浮点除法
/
而不是整数除法'/'。换成

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

对于较小的数字,您可以在浮点运算中获得精确的结果,因此您的模运算可以产生所需的结果。但是,当您到达较低的行时,您会遇到浮点精度的限制--除法的结果不会完全是
blahblah.0
,并且您的
==0
比较失败。因此,您计算了相当多与您的标准不匹配的单元格

最后,添加Thierry的
repair:

for t in range(r+1):
。。。您可以根据需要获得
2361


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


对于从1到
r日志7的n,使用
r/7^n
的截断商。对
t
t-r
执行相同的操作。您还可以在迭代所需值时调整7秒的运行计数。

您确定公式正确吗?这可能是一个更好的问题。此外,
t
的值从0到r,您只会上升到(r-1)。这样,每一行都会丢失一个值(因为它们都是
1
,所以应该对它们进行计数)。您确定公式正确吗?这可能是一个更好的问题。此外,
t
的值从0到r,您只会上升到(r-1)。这样一来,每一行都会漏掉一个值(因为它们都是
1
,所以应该计算它们)。仍然有100个漏掉的值,请参见我对这个问题的评论。@Thierrylahuille:right;你比我先修好了。仍然有100个缺失值,请看我对这个问题的评论。@Thierrylahuille:对;你比我先修好了。