Правильно вычислить квадратные цифровые расширения

Задача проекта Эйлера № 80 гласит:

Хорошо известно, что если корень квадратный из натурального числа не является целым числом, то он иррациональный. Десятичное разложение таких квадратных корней бесконечно без какого-либо повторения.

Квадратный корень из двух 1.41421356237309504880...и цифровая сумма первых ста десятичных цифр 475,

Для первых ста натуральных чисел найдите сумму цифровых сумм первых ста десятичных цифр для всех иррациональных квадратных корней.

Это код, который я создал для этого вопроса:

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 ответ

Решение
  • Проблема не говорит, чтобы игнорировать целую часть чисел.

  • Задание точности 100 десятичных цифр просто означает, что во время вычислений будет использоваться 100 цифр, а не то, что вы получите первые 100 точных десятичных цифр. Просто увеличьте точность, чтобы вычисления дали как минимум 100 правильных цифр:

    getcontext().prec = 102
    

    С помощью 101 недостаточно, чтобы получить правильный ответ.

  • Также вам необходимо правильно получить десятичные цифры:

    ans = str(Decimal(a).sqrt()).replace('.', '')[:100]
    
  • Наконец, первые 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("-------")

это дает правильный ответ.

Код может быть значительно улучшен и сокращен:

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)
Другие вопросы по тегам