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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa algoritmo multiplicación
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Programa algoritmo multiplicación  (Leído 5,231 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Programa algoritmo multiplicación
« en: 26 Diciembre 2011, 16:04 pm »

He hecho un programa que resuelve la multiplicación tal y como lo haríamos sin calculadora, es decir, por ejemplo:

 222
 x22
 ___
 444
444
____
4884

Mi código es el siguiente:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main (void){
  5.  
  6.    int n1,n2,n3,n4,n5,a,b,c;
  7.  
  8.    printf("PRIMER NUMERO ");
  9.    printf("introduce el primer numero");
  10.    scanf("%d", &n1);
  11.  
  12.  
  13.  
  14.     printf("SEGUNDO NUMERO ");
  15.  printf("introduce la primera cifra");
  16.  
  17.  scanf("%d", &n4);
  18.  
  19.      printf("introduce la segunda cifra");
  20.    scanf("%d", &n5);
  21.  
  22. a=n5*n1;
  23. b=n4*n1;
  24. c=a*10+b;            
  25.  
  26. printf(" %d  \n", n1 );
  27. printf(" x %d%d \n", n4, n5 );
  28. printf("________ \n");
  29. printf(" %d   \n", a );
  30. printf("%d   \n", b);
  31. printf("________ \n");
  32. printf("%d", c);
  33.  
  34.  
  35. system("pause");
  36.  
  37. }
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  

Si os fijáis, he hecho que el programa pregunte al principio el primer número, pero que, al preguntar el segundo, lo pregunte separado, es decir, primera cifra, y segunda (el segundo número debe ser solo de dos cifras).

Mi problema es que no sé si se podrá hacer que, al escribir, por ejemplo "23" sepa que la primera cifra es 2, y la segunda; 3. Así creo que quedaría más completo y correcto, pero no sé si se puede hacer...

Muchas gracias.

Saludos.


« Última modificación: 26 Diciembre 2011, 16:21 pm por DickGumshoe » En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Programa algoritmo multiplicación
« Respuesta #1 en: 26 Diciembre 2011, 16:07 pm »

Bien!
¿Piensas mostrar el código o tienes algún problema en particular?


En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #2 en: 26 Diciembre 2011, 16:09 pm »

Lo siento, había escrito un mensaje completo con mi código y mi problema, pero veo que no ha salido bien...

En seguida lo edito.

Lo siento.
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Programa algoritmo multiplicación
« Respuesta #3 en: 26 Diciembre 2011, 16:30 pm »

Si puedes. Una manera es leer el número como si fuese un string, y luego manejar el string como un arreglo, separando las cifras (sabes que array[0] será la primer cifra, y array[1] será la segunda cifra). Te doy la idea, trata de implementarla!

Otra cosa, al final del main debes retornar un valor, como bien declaraste, la función main devuelve un int.

Código
  1. system("pause");
  2. return 0;
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #4 en: 26 Diciembre 2011, 16:40 pm »

Si puedes. Una manera es leer el número como si fuese un string, y luego manejar el string como un arreglo, separando las cifras (sabes que array[0] será la primer cifra, y array[1] será la segunda cifra). Te doy la idea, trata de implementarla!

Otra cosa, al final del main debes retornar un valor, como bien declaraste, la función main devuelve un int.

Código
  1. system("pause");
  2. return 0;

Muchas gracias. Intentaré hacerlo de esa forma.

Muchísimas gracias.

Saludos.
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #5 en: 26 Diciembre 2011, 17:24 pm »

Lo que acabo de hacer es esto:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main (void){
  5.  
  6.    int n1,n2,n3,n5,n6,a,b,c;
  7.  
  8.    printf("PRIMER NUMERO ");
  9.    printf("introduce el primer numero");
  10.    scanf("%d", &n1);
  11.  
  12.  
  13. char n4[3];
  14.  
  15.     printf("SEGUNDO NUMERO ");
  16.  printf("introduce la primera cifra");
  17.  
  18.  scanf("%d", &n4);
  19.  
  20.  
  21.  
  22.  
  23. b=n4[0]*n1;
  24. a=n4[1]*n1;
  25. c=a*10+b;            
  26.  
  27. printf(" %d  \n", n1 );
  28. printf(" x %d%d \n", n4[0], n4[1] );
  29. printf("________ \n");
  30. printf(" %d   \n", a );
  31. printf("%d   \n", b);
  32. printf("________ \n");
  33. printf("%d", c);
  34.  
  35.  
  36. system("pause");
  37. return 0;
  38.  
  39.  
  40.  
  41. }
  42.  
  43.  
  44.  
  45.  

El resultados de las multiplicaciones da bien, pero no está bien hecho el algoritmo.

Cuando poner primer número 222 y segundo 22, debe hacer esto:

   222
   x22
   ___
   444
  444
  ____
  4884

Pero no; hace esto:

   222
  x  220
  _______
  0
  4884
  _______
  4884

No sabía usar las cadenas; ahora sé más o menos.
Tampoco sé porque lo que aprendo lo cojo de los apuntes de mi hermana(que, por cierto, está estudiando matemáticas, pero tiene informática obligatoriamente...).

Volviendo al tema... ¿Estoy usando bien las cadenas? ¿Me falta o me sobra algo?

Bueno, muchas gracias.

Saludos.

« Última modificación: 26 Diciembre 2011, 19:30 pm por DickGumshoe » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #6 en: 26 Diciembre 2011, 18:46 pm »

Lo que pasa es que son caracteres... no numeros... revisate la tabla ASCII, por ejemplo, cuando escribes 4 el indice de n4[0] no sera un valor 4 sera SU VALOR EN ASCII...

Me desvele haciendote estas funciones para extraer un digito X de un numero tipo signed/unsigned int.

Código
  1.  
  2. int extracNumFromUInt(unsigned int iVal, unsigned int index);
  3. int extracNumFromInt(int iVal, unsigned int index);
  4. int getLengthOfUInt(unsigned int iVal);
  5. int getLengthOfInt(int iVal);
  6.  
  7. /**
  8. Proposito:  Obtiene la longitud de un numero Decimal.
  9. Retorno:    Longitud de el numero
  10. NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
  11. By BlackZeroX.
  12. **/
  13. int getLengthOfUInt(unsigned int iVal)
  14. {
  15.    int i = 1;
  16.    while (iVal /= 10)
  17.        i++;
  18.    if (iVal % 10)
  19.        i++;
  20.    return i;
  21. }
  22.  
  23. /**
  24. Proposito:  Obtiene la longitud de un numero Decimal.
  25. Retorno:    Longitud de el numero
  26. NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
  27. By BlackZeroX.
  28. **/
  29. int getLengthOfInt(int iVal)
  30. {
  31.    return getLengthOfUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal);   //  Removemos el signo...
  32. }
  33.  
  34. /**
  35. Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
  36. Retorno:    Si falla retorna ~0
  37.             Si es satisfactorio extrae el numero deseado.
  38. By BlackZeroX.
  39. **/
  40. int extracNumFromInt(int iVal,          //  Numero Deseado.
  41.                     unsigned int index //  El Indice es de Izquierda a Derecha...
  42.                    )
  43. {
  44.    return extracNumFromUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal,   //  Removemos el signo...
  45.                     index);
  46. }
  47.  
  48. /**
  49. Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
  50. Retorno:    Si falla retorna ~0
  51.             Si es satisfactorio extrae el numero deseado.
  52. By BlackZeroX.
  53. **/
  54. int extracNumFromUInt(unsigned int iVal,    //  Numero Deseado.
  55.                     unsigned int index    //  El Indice es de Izquierda a Derecha...
  56.                    )
  57. {
  58.    int iSize = getLengthOfUInt(iVal);
  59.    int iRet = iVal,
  60.        i = 0;
  61.  
  62.    if (index > iSize)                  //  ¿Indice Erroneo?.
  63.        return ~0;
  64.    index = (iSize - index);            //  Corregimos el indice para que se trabaje como si fueran arrays...
  65.    if (index != iSize)                 //  ¿Debemos eliminar los digitos de la parte Izquierda?
  66.    {
  67.        for (i = 0; i < index; ++i)     //  Removemos
  68.            iRet /= 10;
  69.        for (i = 0; i < (index); ++i)   //  suplantamos por 0's
  70.            iRet *= 10;
  71.        iRet = (iVal - iRet);           //  Eliminamos los digitos de la izquierda...
  72.    }
  73.    iSize = getLengthOfUInt(iRet);
  74.    if (iSize > 1)                      //  ¿Debemos eliminar los digitos d ela Derecha?...
  75.        for (i = 1; i < index; ++i)
  76.            iRet /= 10;                 //  Eliminamos...
  77.    return iRet;                        //  Retornamos.
  78. }
  79.  
  80. /// EntryPoint
  81. int main(int argc, char *argv[])
  82. {
  83.    int i = 0;
  84.    int iVal = -4898456;
  85.  
  86.    printf("%d\n", iVal);
  87.  
  88.    for (i = 0; i < getLengthOfInt(iVal); ++i )
  89.        printf("%d\n", extracNumFromInt(iVal, i));
  90.  
  91.    getchar();
  92.  
  93.    return EXIT_SUCCESS;
  94. }
  95.  
  96.  

Temibles Lunas!¡.
« Última modificación: 26 Diciembre 2011, 18:59 pm por BlackZeroX (Astaroth) » En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #7 en: 26 Diciembre 2011, 19:37 pm »

Lo que pasa es que son caracteres... no numeros... revisate la tabla ASCII, por ejemplo, cuando escribes 4 el indice de n4[0] no sera un valor 4 sera SU VALOR EN ASCII...

Me desvele haciendote estas funciones para extraer un digito X de un numero tipo signed/unsigned int.

Código
  1.  
  2. int extracNumFromUInt(unsigned int iVal, unsigned int index);
  3. int extracNumFromInt(int iVal, unsigned int index);
  4. int getLengthOfUInt(unsigned int iVal);
  5. int getLengthOfInt(int iVal);
  6.  
  7. /**
  8. Proposito:  Obtiene la longitud de un numero Decimal.
  9. Retorno:    Longitud de el numero
  10. NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
  11. By BlackZeroX.
  12. **/
  13. int getLengthOfUInt(unsigned int iVal)
  14. {
  15.    int i = 1;
  16.    while (iVal /= 10)
  17.        i++;
  18.    if (iVal % 10)
  19.        i++;
  20.    return i;
  21. }
  22.  
  23. /**
  24. Proposito:  Obtiene la longitud de un numero Decimal.
  25. Retorno:    Longitud de el numero
  26. NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
  27. By BlackZeroX.
  28. **/
  29. int getLengthOfInt(int iVal)
  30. {
  31.    return getLengthOfUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal);   //  Removemos el signo...
  32. }
  33.  
  34. /**
  35. Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
  36. Retorno:    Si falla retorna ~0
  37.             Si es satisfactorio extrae el numero deseado.
  38. By BlackZeroX.
  39. **/
  40. int extracNumFromInt(int iVal,          //  Numero Deseado.
  41.                     unsigned int index //  El Indice es de Izquierda a Derecha...
  42.                    )
  43. {
  44.    return extracNumFromUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal,   //  Removemos el signo...
  45.                     index);
  46. }
  47.  
  48. /**
  49. Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
  50. Retorno:    Si falla retorna ~0
  51.             Si es satisfactorio extrae el numero deseado.
  52. By BlackZeroX.
  53. **/
  54. int extracNumFromUInt(unsigned int iVal,    //  Numero Deseado.
  55.                     unsigned int index    //  El Indice es de Izquierda a Derecha...
  56.                    )
  57. {
  58.    int iSize = getLengthOfUInt(iVal);
  59.    int iRet = iVal,
  60.        i = 0;
  61.  
  62.    if (index > iSize)                  //  ¿Indice Erroneo?.
  63.        return ~0;
  64.    index = (iSize - index);            //  Corregimos el indice para que se trabaje como si fueran arrays...
  65.    if (index != iSize)                 //  ¿Debemos eliminar los digitos de la parte Izquierda?
  66.    {
  67.        for (i = 0; i < index; ++i)     //  Removemos
  68.            iRet /= 10;
  69.        for (i = 0; i < (index); ++i)   //  suplantamos por 0's
  70.            iRet *= 10;
  71.        iRet = (iVal - iRet);           //  Eliminamos los digitos de la izquierda...
  72.    }
  73.    iSize = getLengthOfUInt(iRet);
  74.    if (iSize > 1)                      //  ¿Debemos eliminar los digitos d ela Derecha?...
  75.        for (i = 1; i < index; ++i)
  76.            iRet /= 10;                 //  Eliminamos...
  77.    return iRet;                        //  Retornamos.
  78. }
  79.  
  80. /// EntryPoint
  81. int main(int argc, char *argv[])
  82. {
  83.    int i = 0;
  84.    int iVal = -4898456;
  85.  
  86.    printf("%d\n", iVal);
  87.  
  88.    for (i = 0; i < getLengthOfInt(iVal); ++i )
  89.        printf("%d\n", extracNumFromInt(iVal, i));
  90.  
  91.    getchar();
  92.  
  93.    return EXIT_SUCCESS;
  94. }
  95.  
  96.  

Temibles Lunas!¡.

Perdón, pero... Soy muy principiante en C... Y no entiendo eso que acabas de hacer... No sé qué son los códigos ASCII, a pesar de que he estado mirando en Internet las cadenas (y no venía nada de eso...)

Muchas gracias.

Saludos
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #8 en: 26 Diciembre 2011, 19:56 pm »

No me cites un tema de manera consecutiva se ve orrendo el hilo...

enserio buscaste?

https://encrypted.google.com/search?q=ascii&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:es-ES:official&client=firefox-a

Dulces Lunas!¡.
En línea

The Dark Shadow is my passion.
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Programa algoritmo multiplicación
« Respuesta #9 en: 26 Diciembre 2011, 20:00 pm »

Lo que he mirado en internet son las cadenas. De los códigos ASCII he visto una tabla, pero tanto el valor en decimal como en decimal en los números 0, 1, 2, 3 y 4 son iguales. Y después me pone cosas como "delete, null", que no sé para qué valen...
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Encontrar algoritmo de cifrado de programa de seguridad
Ingeniería Inversa
MaLkAvIaN_NeT 2 3,860 Último mensaje 6 Abril 2006, 02:01 am
por Crack_X
Factor de multiplicación y FSB.
Hardware
alvaroons 4 7,346 Último mensaje 14 Febrero 2011, 02:02 am
por alvaroons
Multiplicación de dos double sale 0
Programación C/C++
Kasswed 1 3,153 Último mensaje 26 Mayo 2011, 17:59 pm
por Mr.Blue
ALGORITMO DE PROGRAMA A PARTIR DE CLAVE VÁLIDA (DUDA)
Hacking
superkini 2 3,714 Último mensaje 16 Junio 2012, 00:42 am
por lapras
Una Ayuda con el algoritmo de un programa.
Java
black47 1 1,733 Último mensaje 14 Noviembre 2012, 15:40 pm
por djimenez39
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines