use strict; use warnings; use Benchmark qw(cmpthese timethese); ################################################################################ my $results = timethese($ARGV[0]//-5, { 'no_integer_module ' =>\&no_integer, 'with_integer_module' =>\&with_integer, }); cmpthese( $results ); ################################################################################ sub no_integer{ my $n=1002; my $len = 1 + 10 * $n / 3; my $pi; my @a= (2) x $len; my $nines = 0; my $predigit = 0; for (my $j =1; $j < $n + 1; ++$j){ my $q = 0; for my $i (reverse 0..$len - 1) { my $x = 10 * $a[$i] + $q * ($i + 1); my $divisor = 2 * $i + 1; $a[$i] = $x % $divisor; $q = $x / $divisor; } $a[0]=$q%10; $q=$q/10; if (9 == $q){ ++$nines; } elsif(10 == $q){ $pi.=$predigit + 1; for (my $k = 0; $k < $nines; $k++){$pi.=0} # print 0 $predigit = $nines = 0; } else{ $pi.= $predigit; $predigit = $q; if(0 != $nines){ for (my $k = 0; $k < $nines; $k++) { $pi.=9; } $nines = 0; } } } } ################################################################################ sub with_integer{ use integer; my $n=1002; my $len = 1 + 10 * $n / 3; my $pi; my @a= (2) x $len; my $nines = 0; my $predigit = 0; for (my $j =1; $j < $n + 1; ++$j){ my $q = 0; for my $i (reverse 0..$len - 1) { my $x = 10 * $a[$i] + $q * ($i + 1); my $divisor = 2 * $i + 1; $a[$i] = $x % $divisor; $q = $x / $divisor; } $a[0]=$q%10; $q=$q/10; if (9 == $q){ ++$nines; } elsif(10 == $q){ $pi.=$predigit + 1; for (my $k = 0; $k < $nines; $k++){$pi.=0} # print 0 $predigit = $nines = 0; } else{ $pi.= $predigit; $predigit = $q; if(0 != $nines){ for (my $k = 0; $k < $nines; $k++) { $pi.=9; } $nines = 0; } } } }