multiNum = 1.0
multiDen = 1.0
for den in range(11,100):
for num in range(10,den): # ensure fraction < 1
if (den%10 != 0 or num%10 != 0):
frac = num/den
cancelFrac = (float(str(num)[0])) / (float(str(den)[0])
if ((abs(frac - cancelFrac)) < 0.00001):
multiNum = multiNum*(int(str(num)[0]))
multiDen = multiDen*(int(str(den)[0]))
## simplyfy fraction
i = 2
while ((multiNum%i == 0) and (multiDen%i == 0)):
multiNum = multiNum/i
multiDen = multiDen/i
i = 3
while ((multiNum%i == 0) and (multiDen%i == 0)):
multiNum = multiNum/i
multiDen = multiDen/i
i = 5
inc = 2
while (i < 82): ## this function generates primes (and more)
while ((multiNum%i == 0) and (multiDen%i == 0)):
multiNum = multiNum/i
multiDen = multiDen/i
i = i + inc
inc=6-inc
print(multiDen)
这个程序正用于项目euler问题33,我找不到语法错误。我正在使用IDLE。 这是我试图解决的问题
49/98分数是一个奇怪的分数,作为一个没有经验的数学家试图简化它可能错误地认为49/98 = 4/8,这是正确的,是通过取消9s获得的。
我们将考虑像30/50 = 3/5这样的分数是微不足道的例子。
这种类型的分数恰好有四个非平凡的例子,小于一个值,并且在分子和分母中包含两个数字。
如果这四个分数的乘积以最低的常用项给出,请找到分母的值。
答案 0 :(得分:1)
当按操作顺序处理分组时,您在代码中使用了太多括号。例如,while ((multiNum%i == 0) and (multiDen%i == 0)):
只能是while multiNum%i == 0 and multiDen%i == 0:
,或while not (multiNum%i or multiDen%i):
符合De Morgan定律。
这个括号内的拙见导致第7行遗失了一个:
cancelFrac = (float(str(num)[0])) / (float(str(den)[0])
^
我建议使用跟踪匹配括号的开发环境。甚至像Notepad ++这样的东西也可以。
答案 1 :(得分:0)
我可以看到一个语法错误:
cancelFrac = (float(str(num)[0])) / (float(str(den)[0])
#Mismatched parenthesis right here ^------------------^
一般来说,你也有太多的括号。例如,这可以正常工作:
cancelFrac = float(str(num)[0]) / float(str(den)[0])
这个
i = 2
while ((multiNum%i == 0) and (multiDen%i == 0)):
multiNum = multiNum/i
multiDen = multiDen/i
应简化为此
i = 2
while multiNum % i == 0 and multiDen % i == 0:
multiNum = multiNum/i
multiDen = multiDen/i
此外,将来请包含您的追溯,它将帮助每个人帮助您找到错误。