elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Calcular mcd. Compila bien pero no corre
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Calcular mcd. Compila bien pero no corre  (Leído 16,890 veces)
nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Compila bien y no corre
« Respuesta #10 en: 1 Julio 2010, 22:41 pm »

Citar
... si te fijas bien en el codigo no seria lo mismo hacer un while que un do-while ya que con este ultimo estarias ejecutando 3 sentencias totalmente innecesarias.

Bueno, eso solo sucederia cuando uno de los números dados como entrada es cero lo cual no es una entrada válida para el programa. Si se ha de verificar por la entrada válida, ¿porqué no tambien verificar por la entrada de números negativos?

czealt, porque pensas que se tendria que verificar por la entrada de numeros negativos?

Citar
El máximo común divisor (abreviado mcd o m.c.d.) de dos o más números enteros es el mayor número que los divide sin dejar resto. - Wikipedia

Que se ingrese como entrada el valor 0, no quiere decir que este sea una entrada invalida para el programa, ya que por definicion seria correcto. Yo lo que te queria decir con respecto del do-while es que ejecutarias 3 sentencias totalmente innecesarias que no aportan ningun valor al objetivo del programa. Por eso es mejor usar el while y evitar ejecutar ese bloque de codigo.

Salu10.


En línea

MIG80

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Compila bien y no corre
« Respuesta #11 en: 2 Julio 2010, 00:00 am »

OK nicolas_cof si 0 es un valor válido como entrada para el programa que calcula el M.C.D de dos números dime cuanto es el MCD de 0 y 1?


En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Compila bien y no corre
« Respuesta #12 en: 2 Julio 2010, 00:09 am »

OK nicolas_cof si 0 es un valor válido como entrada para el programa que calcula el M.C.D de dos números dime cuanto es el MCD de 0 y 1?

1

Salu10.
En línea

MIG80

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Compila bien y no corre
« Respuesta #13 en: 2 Julio 2010, 00:35 am »

Muy bien (señido a la definición, como debe de ser).

Saludos.
En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Compila bien y no corre
« Respuesta #14 en: 2 Julio 2010, 01:10 am »

Muy bien (señido a la definición, como debe de ser).

Saludos.

Código:
function mcd(a, b)
    while b ≠ 0
       t := b
       b := a mod b
       a := t
    return a

Salu10.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Compila bien y no corre
« Respuesta #15 en: 2 Julio 2010, 01:48 am »

¡Buenas!

Solo un apunte y no con intencion de faltar a nadie, simplemente con la de informar.

El mcd de dos enteros (d a partir de ahora) a y b, cumple que si c|a y c|b entonces d|c. En estas condiciones se encuentran dos numeros enteros, d y -d.

Para evitar confusiones y por la unicidad de los resultados, se llama mcd(a,b) a max{d,-d}, es decir, al que es positivo.

Otra propiedad del mcd es que mcd(a,b) = mcd (|a|,|b|), por lo que para obtener el mcd de dos enteros por medio del algoritmo de euclides, al trabajar con ordenadores, lo correcto seria trabajar con el valor absoluto de los datos introducidos, ya que de esta forma obtendremos directamente el valor positivo.

Otro apunte es que para calcular el mcd por medio del algoritmo de auclides, se utiliza la division euclidea que dice que dados dos enteros a y b, existen otros dos enteros, unicos, c y r cumpliendo que:

a = cb + r    donde    0 <= r < |b|

Es decir, el resto es positivo, y esto es algo que en C/C++ no se cumple al calcular modulos, ya que si el dividendo y el divisor tienen signos opuestos a%b dara como resultado un entero negativo.

¡Saludos!
« Última modificación: 2 Julio 2010, 01:50 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Compila bien y no corre
« Respuesta #16 en: 2 Julio 2010, 01:56 am »

Cita de: do-while
... lo correcto seria trabajar con el valor absoluto de los datos introducidos ...

Tenes razon do-while, esto ultimo se me habia pasado por alto! Gracias ;)

Salu10.
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Compila bien y no corre
« Respuesta #17 en: 2 Julio 2010, 01:59 am »

¡De nada!

Todo el mundo tiene algun patinazo de vez en cuando, servidor incluido  :silbar:, faltaria mas.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
cbug

Desconectado Desconectado

Mensajes: 147



Ver Perfil
Re: Compila bien y no corre
« Respuesta #18 en: 2 Julio 2010, 02:36 am »

Podría ser esta una solución rápida, me basé en teoremas de congruencias:

Código
  1. #include <stdio.h>
  2.  
  3. int mcd(int a, int b)
  4. {
  5.  if(b == 0)
  6.    return a;
  7.  else
  8.    mcd(a, a%b);
  9. }
  10.  
  11. void _abs(int *a)
  12. {
  13.  if(*a < 0) *a *= -1;
  14. }
  15.  
  16. int main()
  17. {
  18.  int x, y, mxdiv;
  19.  scanf("%d %d", &x, &y);
  20.  _abs(&x);
  21.  _abs(&y);
  22.  printf("\t %d \t %d", x, y);
  23.  mxdiv = mcd(x, y);
  24.  printf("\n MCD > %d \n", mxdiv);
  25.  return 0;
  26. }

Lei que también el operador condicional ? sería un buen reemplazo para ese if de _asb.
« Última modificación: 2 Julio 2010, 02:43 am por cbug » En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: Compila bien y no corre
« Respuesta #19 en: 2 Julio 2010, 20:29 pm »

cbug, fijate en esta parte...

Código:
int mcd( int a, int b )
{
  if ( b == 0 )
    return a;
  else
    mcd( b, a % b ); //mcd( a, a % b );
}

Yo usaria la funcion abs() dentro de la funcion mcd(), debido a lo que habia aclarado do-while, que a mi se me habia pasado por alto. Ya que haciendo esto uno se olvida de tener que aplicarle el valor absoluto a los numeros antes de pasarlos a la funcion mcd().

Otro punto que se podria ver, seria usar la funcion abs() de la libreria stdlib.h

Código:
#include <stdio.h>
#include <stdlib.h>
 
int mcd( int a, int b )
{
    a = abs( a );
    b = abs( b );
    return ( b == 0 ) ? a : mcd( b, a % b );
}
 
int main( void )
{
    int x, y;
    scanf( "%d %d", &x, &y );
    printf( "mcd: %d\n", mcd( x, y ) );
    return 0;
}

Salu10.
En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines