Bri*_*ace 0 python square-root
众所周知,如果自然数的平方根不是整数,那么它是不合理的.这种平方根的十进制扩展是无限的,没有任何重复模式.
二的平方根是
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)
Run Code Online (Sandbox Code Playgroud)
它显示错误的答案,我认为我一路上都错过了一些东西.任何形式的帮助表示赞赏.
问题并不是要忽略数字的整数部分.
通过指定100个十进制数字的精度,意味着在计算过程中将使用100位数,而不是您将获得前100个精确的十进制数字.只需增加精度即可确保计算产生至少100个正确的数字:
getcontext().prec = 102
Run Code Online (Sandbox Code Playgroud)
使用101不足以得到正确的答案.
此外,您必须正确获取小数位数:
ans = str(Decimal(a).sqrt()).replace('.', '')[:100]
Run Code Online (Sandbox Code Playgroud)最后第100张自然数从去0到99包容不是从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("-------")
Run Code Online (Sandbox Code Playgroud)
这会产生正确的答案.
代码可以大大改进和缩短:
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)
Run Code Online (Sandbox Code Playgroud)