Правильно вычислить квадратные цифровые расширения
Задача проекта Эйлера № 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)