正确计算平方根数字扩展

时间:2015-07-24 11:37:47

标签: python square-root

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)

它出现了错误的答案,我认为我错过了一些东西。任何形式的帮助都表示赞赏。

1 个答案:

答案 0 :(得分:5)

  • 问题是说要忽略数字的整数部分。

  • 通过指定100个十进制数字的精度,仅表示在计算期间将使用100位数字,表示您将获得前100个精确的十进制数字。只需增加精度即可确保计算产生至少100个正确的数字:

    ans = str(Decimal(a).sqrt()).replace('.', '')[:100]
    

    使用0不足以得到正确答案。

  • 此外,您必须正确获取小数位数:

    99
  • 最后,前100个自然数从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("-------") 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)