正确计算平方根数字扩展

Bri*_*ace 0 python square-root

项目欧拉的第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)
Run Code Online (Sandbox Code Playgroud)

它显示错误的答案,我认为我一路上都错过了一些东西.任何形式的帮助表示赞赏.

Bak*_*riu 5

  • 问题并不是要忽略数字的整数部分.

  • 通过指定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张自然数从去099包容不是1100包容性.

所以你的代码将成为:

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)