Lun May 01, 2006 11:01 am
|
 |
dacons
Perlero Nuevo

|
Registrado: 27 Feb 2006
Mensajes: 48
|
|
| Algoritmo de Euclides Máximo Común Divisor |
|
|
Hola a todos, estoy intentando hacer el susodicho algoritmo pero no hay forma,
| Código: |
sub mcd {
$n=$_[0];
$n1=$_[1];
while (($_[0] % $_[1]) != 0) {
$c=$_[1];
$_[1] = $_[0] % $_[1];
$_[0]=$c;
}
print "El mcd ($n , $n1) = $_[0] \n";
}
sub mcm {
$n=$_[0];
$n1=$_[1];
$mcm= ($_[0] * $_[1]) / mcd($_[0],$_[1]);
print "El mcm ($n , $n1) = $mcm ";
}
&mcd(945,651);
&mcm(945,651); |
¿Dónde está el fallo? Según mi editor de perl está en $_[1] = $_[0] % $_[1];
¿hay alguna otra forma de hacer este algoritmo? |
|
|
|

Lun May 01, 2006 11:14 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
|
|
|
|
|
Estas usando variables globales. Eso quiere decir que las variables de una función interfieren en la otra.
Cambiales 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...
| Código: |
#!/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 |
Un cambio que se puede hacer en el bucle principal es agregar la última vuelta de procesado:
| Código: |
while ( $b != 0 ) {
# ... lo mismo que antes ...
}
# $a tiene el último divisor
print "El mcd ($_[0] , $_[1]) = $a\n";
return $a; |
Más sobre el algoritmo de Euclides. |
|

Lun May 01, 2006 12:14 pm
|
 |
dacons
Perlero Nuevo

|
Registrado: 27 Feb 2006
Mensajes: 48
|
|
|
|
|
| ¿para que se utilizan las dos primeras líneas que empiezan por use? |
|
Lun May 01, 2006 12:27 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4084
Ubicación: Valladolid, España
|
|
|
|
|
use warnings; activa los avisos si Perl encuentra algo 'extraño' en tu código, que posiblemente provoque errores. También posibles errores de sintáxis.
use strict; nos 'obliga' a programar de una forma estricta: todas las variables han de ser definidas antes de ser usadas, para indicar si son locales o globales.
Yo a veces uso use diagnostics; para producir una salida mucho más extensa con la explicación del error o aviso. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|