We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
Project Euler #80: Square root digital expansion
Project Euler #80: Square root digital expansion
Sort by
recency
|
21 Discussions
|
Please Login in order to post a comment
My Solution in python
from decimal import Decimal,getcontext def sum_of_digits(n,p): getcontext().prec=p+5 sqrt_str=str(Decimal(n).sqrt()).replace('.','')[:p] return sum(int(digit) for digit in sqrt_str) def main(): N= int(input().strip()) P= int(input().strip()) total_sum= sum(sum_of_digits(i,P) for i in range (1,N+1) if int (i**0.5)**2 != i) print(total_sum) if name=="main": main()
Python 3 solution:
Finally solved this problem after a lot of efforts. Approach:
With F# (so .NET), this approach solves all test cases but the last one. With java, this exact same approach solves all test cases (test case 9 takes 3 seconds).
I'm disappointed to see that all my efforts to solve this problem in F# have failed. I see that some people managed to solve this problem with C#, so it could be that another approach than mine would be fast enough also in F#.
Good luck!
import decimal num=decimal.Decimal(int(input())) dot100 = decimal.Context(prec=10000) num=num.sqrt(dot100) num=str(num) precision=int(input()) sum1=x=i=0 while num[i]!=".": i=i+1 num=num[:i]+num[i+1:] num=num[0:precision] print(sum([int(x) for x in num]))
this is my code i am passing only the first test condition
You only need to compute the square roots of prime numbers, because the square root of a composite number c is the product of the square roots of its prime factors.
E.g. for c=12: sqrt(12) = sqrt(2*2*3) = sqrt(2) * sqrt(2) * sqrt(3)
Actually you don't need a full factorization. Choose any two factors a and b where ab=c: sqrt(12) = sqrt(3) * sqrt(4) (or sqrt(2) * sqrt(12))
You need to be a bit careful, though: a factor can be a perfect square (such as 4), therefore memoize all (!) square roots, even the trivial ones of perfect squares. And even more, you have to increase your precision by a few digits because you'll introduce some rounding errors when multiplying. Adding 15 extra digits is more than enough.
After I added this trick to my code it became about 4x faster for N=100 and P=10000.