sub perms { return () unless @_; my ($car, @cdr) = @_; # All permutations that do not include car my @cdr_perm = perms(@cdr); # All permutations that include car my @car_perm = map { my $this_perm = $_; map { substr($this_perm, 0, $_) . $car . substr($this_perm, $_) } 0..length($this_perm) } (@cdr_perm); (@car_perm, @cdr_perm, $car); } my $max = 0; OUTER: for my $num (perms(reverse(1..4,6..9)), perms(9,7,5,3,1)) { next unless $num > $max; my @digits = split //, $num; $num % $_ > 0 and next OUTER for @digits; print "$num is divisible by all of @digits\n"; $max = $num; } print "Biggest found is $max\n";