平方根的数字展开
作者:Andrei Osipov
https://projecteuler.net/problem/80
众所周知,如果一个自然数的平方根不是整数,那么它就是无理数。这种平方根的小数展开是无限的,根本没有任何重复模式。2 的平方根是 1.41421356237309504880...,前一百位小数的数字和是 475。
对于前一百个自然数,求所有无理平方根的前一百位小数的数字和的总和。
解决方案中使用了以下算法:http://www.afjarvis.staff.shef.ac.uk/maths/jarvisspec02.pdf
use v6; my constant $limit = 100; sub sqrt-subtraction($n) { my Int $a = $n * 5 ; my Int $b = 5; while $b < 10 * 10 ** $limit { given $a <=> $b { when More | Same { # replace a with a − b, and add 10 to b. $a -= $b; $b += 10; } when Less { # add two zeros to a $a *= 100; # add a zero to b just before the final digit (which will always be ‘5’). $b = ($b - (my $x = $b % 10)) * 10 + $x; } } } $b; } sub MAIN(Bool :$verbose = False) { say [+] do for 1 ... 100 -> $n { next if $n.sqrt.floor ** 2 == $n; my $x = [+] $n.&sqrt-subtraction.comb[^$limit]; say "$n $x" if $verbose; $x; } say "Done in {now - INIT now}" if $verbose; }