Combinations with repetitions/Square digit chain: Difference between revisions

Added Perl example
m (→‎{{header|Perl 6}}: Possibly better work-around for uninitialized warnings)
(Added Perl example)
Line 275:
12024696404768024 numbers produce 1 and 87975303595231975 numbers produce 89
</pre>
 
=={{header|Perl}}==
{{trans|Perl 6}}
<lang perl>use strict;
use feature 'say';
 
#use bigint; # un-comment to support the k = 17 case
 
sub comma { reverse ((reverse shift) =~ s/(.{3})/$1,/gr) =~ s/^,//r }
 
sub endsWithOne {
my($n) = @_;
my $digit;
my $sum = 0;
my $nn = $n;
while () {
while ($nn > 0) {
$digit = $nn % 10;
$sum += $digit**2;
$nn = int $nn / 10;
}
return 1 if $sum == 1;
return 0 if $sum == 89;
$nn = $sum;
$sum = 0;
}
}
 
my @ks = <7 8 11 14>;
 
for my $k (@ks) {
my @sums = <1 0>;
my $s;
for my $n (1 .. $k) {
for my $i (reverse 1 .. $n*81) {
for my $j (1 .. 9) {
last if ($s = $j**2) > $i;
$sums[$i] += $sums[$i-$s];
}
}
}
my $count1 = 0;
for my $i (1 .. $k*81) { $count1 += $sums[$i] if endsWithOne($i) }
my $limit = 10**$k - 1;
say "For k = $k in the range 1 to " . comma $limit;
say comma($count1) . ' numbers produce 1 and ' . comma($limit-$count1) . " numbers produce 89\n";
}</lang>
{{out}}
<pre>For k = 7 in the range 1 to 9,999,999
1,418,853 numbers produce 1 and 8,581,146 numbers produce 89
 
For k = 8 in the range 1 to 99,999,999
14,255,666 numbers produce 1 and 85,744,333 numbers produce 89
 
For k = 11 in the range 1 to 99,999,999,999
15,091,199,356 numbers produce 1 and 84,908,800,643 numbers produce 89
 
For k = 14 in the range 1 to 99,999,999,999,999
13,770,853,279,684 numbers produce 1 and 86,229,146,720,315 numbers produce 89</pre>
 
=={{header|Perl 6}}==
2,392

edits