Project Euler's problem number 80读到:
众所周知,如果自然数的平方根不是 整数,那么它是不合理的。这种方形的十进制扩展 根是无限的,没有任何重复模式。
两个的平方根是
1.41421356237309504880...
和数字 前一百个十进制数字的总和是475
。对于前100个自然数,找到总数 所有的前100位小数的数字和 不合理的平方根。
这是我为此问题制作的代码:
from decimal import *
from math import sqrt
getcontext().prec = 100
def digitalsum(n):
sum = 0
for a in n:
sum += int(a)
return sum
total = 0
for a in range(1, 101):
if not sqrt(a) % 1 == 0:
ans = str(Decimal(a).sqrt())
ans = ans[2::]
print(a)
print(digitalsum(ans))
print("-------")
total += digitalsum(ans)
print(total)
它出现了错误的答案,我认为我错过了一些东西。任何形式的帮助都表示赞赏。
答案 0 :(得分:5)
问题是不说要忽略数字的整数部分。
通过指定100个十进制数字的精度,仅表示在计算不期间将使用100位数字,表示您将获得前100个精确的十进制数字。只需增加精度即可确保计算产生至少100个正确的数字:
ans = str(Decimal(a).sqrt()).replace('.', '')[:100]
使用0
不足以得到正确答案。
此外,您必须正确获取小数位数:
99
最后,前100个自然数从1
到100
,包括不从from decimal import *
from math import sqrt
getcontext().prec = 102
def digitalsum(n):
sum = 0
for a in n:
sum += int(a)
return sum
total = 0
for a in range(100):
if not sqrt(a) % 1 == 0:
ans = str(Decimal(a).sqrt()).replace('.', '')[:100]
print(a)
print(digitalsum(ans))
print("-------")
到from __future__ import print_function #for python2 compatibility.
from math import sqrt
from decimal import Decimal, getcontext
getcontext().prec = 102
total = 0
for a in range(100):
if not sqrt(a) % 1 == 0:
ans = str(Decimal(a).sqrt()).replace('.', '')[:100]
digits = map(int, ans)
print(a, sum(digits), "--------", sep='\n')
total += sum(digits)
print(total)
。
所以你的代码会变成:
coalesce(c1, c2)
这会产生正确的答案。
代码可以大大改进和缩短:
coalesce(c3, c4, c5, c6)