平方根的数字展开

作者:Andrei Osipov

https://projecteuler.net/problem/80

众所周知,如果一个自然数的平方根不是整数,那么它就是无理数。这种平方根的小数展开是无限的,根本没有任何重复模式。2 的平方根是 1.41421356237309504880...,前一百位小数的数字和是 475。

对于前一百个自然数,求所有无理平方根的前一百位小数的数字和的总和。

解决方案中使用了以下算法:http://www.afjarvis.staff.shef.ac.uk/maths/jarvisspec02.pdf

源代码:prob080-andreoss.pl

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;
}