#!/usr/bin/perl use strict; use warnings; use Carp (); local $SIG{__WARN__} = \&Carp::cluck; sub unites { my ($n) = @_; return $n % 10; } sub dizaines { my ($n) = @_; return unites($n / 10); } sub extrait { my ($n, $p) = @_; while ($p != 1) { $n /= 10; $p --; } return unites($n); } sub extraitRecursif { my ($n, $p) = @_; if ($p == 1) { return unites($n); } else { return extraitRecursif ($n / 10, $p - 1); } } sub nbChiffresRecursif { my ($n) = @_; return 1 if $n <= 10; return 1 + nbChiffresRecursif ($n / 10); } sub nbChiffres { my ($n) = @_; my $nbC = 1; while ($n > 10) { $nbC++; $n /= 10; } return $nbC; } sub sommeChiffres { my ($n) = @_; my $sum = 0; while ($n >= 1) { $sum += unites($n); $n /= 10; } return $sum; } sub sommeChiffresRecursif { my ($n) = @_; return 0 if $n < 1; return unites($n) + sommeChiffresRecursif($n / 10); } sub divise { my ($diviseur, $n) = @_; return ! ($n % $diviseur); } sub sommeDiviseursStricts { my ($n) = @_; my $sum = 0; for (my $i = 1 ; $i < $n ; $i++) { $sum += $i if divise($i, $n); } return $sum; } sub sontAmis { my ($a, $b) = @_; return sommeDiviseursStricts($a) == $b && sommeDiviseursStricts($b) == $a; } sub estParfait { my ($n) = @_; return sontAmis($n, $n); } sub sommeParties { my ($gauche, $p) = @_; my $droite = 0; my $puiss = 1; for (my $i = 1 ; $i <= $p ; $i++) { $droite += $puiss*unites($gauche); $puiss *= 10; $gauche = int($gauche/10); } return $droite + $gauche; } sub estKaprekar { my ($n) = @_; my $carre = $n * $n; my $nbC = nbChiffres($carre); for (my $i = 1 ; $i <= $nbC ; $i++) { return 1 if $n == sommeParties($carre, $i); } return 0; } print "6 = ".unites(156)."\n"; print "5 = ".dizaines(456)."\n"; print "7 = ".extrait(4657456, 4)."\n"; print "7 = ".extraitRecursif(4657456, 4)."\n"; print "9 = ";nbChiffresRecursif(123657456)."\n"; print "9 = ".nbChiffres(123657456)."\n"; print "33 = ".sommeChiffres(657456)."\n"; print "33 = ".sommeChiffresRecursif(657456)."\n"; print "6 = ".sommeDiviseursStricts(6)."\n"; print "6 ami avec 9\n" if sontAmis(6, 9); print "220 ami avec 284\n" if sontAmis(220, 284); print "18 est parfait\n" if estParfait(18); print "28 est parfait\n" if estParfait(28); print "165 = ".sommeParties(12540, 2)."\n"; for(my $i = 1 ; $i <= 100000 ; $i++) { print "$i est Kaprekar\n" if estKaprekar($i); }