• Publicidad

Calcular el mcd

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Calcular el mcd

Notapor mparrado8 » 2013-04-10 14:59 @666

Cuando dije que estaría mucho por aquí, no mentía.

También tengo que hacer un programa que calcule el máximo común divisor de dos números.

Lo primero que se me ha ocurrido es hacerlo mediante el uso de bucles while y un array para almacenar los divisores de cada número.

De momento he hecho esto, pero hay algún fallo, porque se ejecuta pero no pone los números.

Gracias de antemano.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Introduce un numero:\n";
  2. $a = <STDIN>;
  3. $n = 2;
  4. while ($a%$n > 0)
  5. {
  6. $c = $a/$n;
  7.         if ($a%$n == 0)
  8.         {
  9.                 push @divisores, $n;
  10.         }
  11.                 while ($c > 1)
  12.                 {
  13.                 $c/$n;
  14.                 } $n++;
  15.        
  16. }
  17. print "Los divisores son @divisores";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


He "investigado" un poco y he encontrado una forma de hallar el mcd en C, que consiste en restar los números si uno es mayor que el otro. De momento he hecho lo siguiente, creo que el problema está en la declaración de las variables pero realmente no lo sé.

¿Puedes ayudarme?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Introduce un número:\n";
  2. $a = <STDIN>;
  3. $n = 2;
  4. while ($a%$n > 0)
  5. {
  6. $c = $a/$n;
  7.         if ($a%$n == 0)
  8.         {
  9.                 push @divisores, $n;
  10.         }
  11.                 while ($c > 1)
  12.                 {
  13.                 $c/$n;
  14.                 } $n++;
  15.        
  16. }
  17. print "Los divisores son @divisores";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
mparrado8
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-04-10 12:58 @582

Publicidad

Re: Calcular el mcd

Notapor explorer » 2013-04-10 15:59 @707

El algoritmo no está bien implementado: la línea 13 no hace nada. Sí, es una división, pero el resultado no queda almacenado en ningún sitio.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Calcular el mcd

Notapor mparrado8 » 2013-04-10 16:41 @737

He probado a hacerlo de otra forma, pero parece ser que tampoco funciona, me estoy desesperando.


print "introduce un numero\n";
$a = <STDIN>;
print "introduce otro numero\n";
$b = <STDIN>;

if ($a =! $b)
{
$c = $a - $b;
if ($c > 0)
{
while ( $c > $b)
{
$r = $c - $b;
push @divisor, $r;
}
}
}
print "el máximo común divisor es @divisor";

Y la otra corregida que sigue sin funcionar de la forma esperada, pero aún así ¿a la división debería asignarle una variable temporal o normal?



print "Introduce un numero:\n";
$a = <STDIN>;
$n = 2;
while ($a%$n > 0)
{
$c = $a/$n;
if ($a%$n == 0)
{
push @divisores, $n;
}
while ($c > 1)
{
$r = $c/$n;
} $n++;

}
print "Los divisores son @divisores";
mparrado8
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-04-10 12:58 @582

Re: Calcular el mcd

Notapor explorer » 2013-04-10 16:52 @745

En la página de la Wikipedia tienes el algoritmo de Euclides donde muestra lo fácil que es calcular el Máximo común divisor.

Inténtalo. Si no puedes, avísanos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Calcular el mcd

Notapor mparrado8 » 2013-04-10 18:00 @791

Ya lo he leído, aunque no sé si lo habré entendido muy bien, porque no soy ningún lince para esto de la programación. Teniendo dos números diferentes y que ninguno sea 0, lo primero que hay que hacer es una división, y luego el resto de la división se convierte en uno de los nuevos números de los que quieres encontrar el máximo común divisor, y haces así hasta que el resto es 0. Si la explicación la he entendido, tengo la sensación de que no sé plasmarlo bien en lenguaje Perl.

Muchas gracias por toda la ayuda.



print "Introduce un numero:\n";
$a = <STDIN>;
print "Introduce otro numero:\n";
$b = <STDIN>;
if ($a > $b)
{
while (($a%$b) != 0)
{
$r = $a%$b;
my $a = $b;
$div = $b;
}
}

if ($a < $b)
{
while ($b%$a != 0)
{
$r = $b%$a;
$temp = $b;
$temp = $a;
$div = $b;
}
}

print " El maximo comun divisor es $div";
mparrado8
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-04-10 12:58 @582

Re: Calcular el mcd

Notapor explorer » 2013-04-10 18:54 @829

Para que el código Perl aparezca bonito, debes hacer que las marcas Perl *rodeen* el código. No vale con pulsar el botón.

O de otra forma: seleccionas el código y luego le das al botón Perl.

Casi lo tenías :) Creaste demasiadas variables que no iban a ningún sitio...
Paciencia, y fijarse en lo que le estamos pidiendo al ordenador.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. print "Introduce un número mayor que cero:\n";          # Teniendo dos números diferentes
  7. my $a = <STDIN>;
  8. chomp $a;
  9.  
  10. print "Introduce otro número mayor que cero:\n";
  11. my $b = <STDIN>;
  12. chomp $b;
  13.  
  14. if ($a and $b) {                                        # y que ninguno sea 0
  15.  
  16.     if ($a < $b) {                                      # los ordenamos de mayor a menor
  17.         ($a, $b) = ($b, $a);
  18.     }
  19.  
  20.     do {                                                # hay que hacer
  21.         my $resto = $a % $b;                            # una división, y luego el resto de la división
  22.         $a = $b;
  23.         $b = $resto;                                    # se convierte en uno de los nuevos números
  24.     } until ($b == 0);                                  # y haces así hasta que el resto es 0
  25.  
  26.     print "El máximo común divisor es: $a\n";
  27. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Calcular el mcd

Notapor mparrado8 » 2013-04-11 05:58 @290

¡Muchísimas gracias! Bueno, parece que voy progresando algo, a ver si me familiarizo con el bucle do{} y me fijo más en las cosas, que esto de programar me va a acabar gustando :D
mparrado8
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-04-10 12:58 @582

Re: Calcular el mcd

Notapor mparrado8 » 2013-04-11 06:19 @304

Una última pregunta, ¿el print tiene que estar necesariamente dentro del bucle o se puede poner después de la última llave que delimita el bucle?
mparrado8
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-04-10 12:58 @582

Re: Calcular el mcd

Notapor explorer » 2013-04-11 06:23 @307

Naturalmente, tu misma puedes hacer la prueba.

Pero... ¿qué ocurrirá si alguno de los números es 0? :wink:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Calcular el mcd

Notapor mparrado8 » 2013-04-11 07:00 @333

¡Éste ya lo tengo hecho! Ahora quería probar a hacer el mismo programa pero aplicando el Teorema de Euclides de las restas continuas, lo que pasa es que solo he visto un organigrama y no me ha quedado muy claro, y en la wikipedia tampoco lo encuentro :( ¿Dónde puedo encontrarlo? Sé que hay que usar variables temporales, pero no me ha quedado muy claro el mecanismo.
mparrado8
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2013-04-10 12:58 @582

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron