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