Estas usando variables globales. Eso quiere decir que las variables de una función interfieren en la otra.
Cámbiales de nombre, o mejor, usa
my.
Otro fallo es jugar con los valores
$_[0] para devolver valores. Es mejor usar el return siempre que sea posible...
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings;
use strict;
sub mcd {
my $a = $_[0];
my $b = $_[1];
my $c;
# Nos aseguramos que $a siempre sea mayor que $b
if ( $a < $b ) { ( $a, $b ) = ( $b, $a ) }
# Bucle mientras no lleguemos a un resto de división igual a 0
while ( ($b > 0) and (( $a % $b ) != 0) ) {
#print "1: $a $b\n";
$c = $b;
$b = $a % $b;
$a = $c;
#print "2: $a $b\n";
}
# El resultado es el último divisor encontrado
print "El mcd ($_[0] , $_[1]) = $b\n";
return $b;
}
sub mcm {
my $a = $_[0];
my $b = $_[1];
my $mcm = ($a * $b) / mcd( $a, $b );
print "El mcm ($a , $b) = $mcm\n";
return $mcm;
}
&mcd(945,651); # El mcd (945 , 651) = 21
&mcm(945,651); # El mcm (945 , 651) = 29295
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Un cambio que se puede hacer en el bucle principal es agregar la última vuelta de procesado:
Using perl Syntax Highlighting
while ( $b != 0 ) {
# ... lo mismo que antes ...
}
# $a tiene el último divisor
print "El mcd ($_[0] , $_[1]) = $a\n";
return $a;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Más sobre el algoritmo de
Euclides.