平方根的数字展开
作者: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;
}
Perl 6 示例