Programa algoritmo multiplicación

Iniciado por DickGumshoe, 26 Diciembre 2011, 16:04 PM

0 Miembros y 1 Visitante están viendo este tema.

DickGumshoe

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:


#include <stdlib.h>
#include <stdio.h>

int main (void){
   
   int n1,n2,n3,n4,n5,a,b,c;
   
   printf("PRIMER NUMERO ");
   printf("introduce el primer numero");
   scanf("%d", &n1);
   

   
    printf("SEGUNDO NUMERO ");
 printf("introduce la primera cifra");
 
 scanf("%d", &n4);
   
     printf("introduce la segunda cifra");
   scanf("%d", &n5);
   
a=n5*n1;
b=n4*n1;
c=a*10+b;            
   
printf(" %d  \n", n1 );
printf(" x %d%d \n", n4, n5 );
printf("________ \n");
printf(" %d   \n", a );
printf("%d   \n", b);
printf("________ \n");
printf("%d", c);


system("pause");

}









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.

Ferno

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

DickGumshoe

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.

Ferno

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.

system("pause");
return 0;

DickGumshoe

Cita de: Ferno 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.

system("pause");
return 0;


Muchas gracias. Intentaré hacerlo de esa forma.

Muchísimas gracias.

Saludos.

DickGumshoe

#5
Lo que acabo de hacer es esto:

#include <stdlib.h>
#include <stdio.h>

int main (void){
   
   int n1,n2,n3,n5,n6,a,b,c;
   
   printf("PRIMER NUMERO ");
   printf("introduce el primer numero");
   scanf("%d", &n1);
   

char n4[3];
   
    printf("SEGUNDO NUMERO ");
 printf("introduce la primera cifra");
 
 scanf("%d", &n4);
   
 


b=n4[0]*n1;
a=n4[1]*n1;
c=a*10+b;            
   
printf(" %d  \n", n1 );
printf(" x %d%d \n", n4[0], n4[1] );
printf("________ \n");
printf(" %d   \n", a );
printf("%d   \n", b);
printf("________ \n");
printf("%d", c);


system("pause");
return 0;



}





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.


BlackZeroX

#6
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.



int extracNumFromUInt(unsigned int iVal, unsigned int index);
int extracNumFromInt(int iVal, unsigned int index);
int getLengthOfUInt(unsigned int iVal);
int getLengthOfInt(int iVal);

/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/
int getLengthOfUInt(unsigned int iVal)
{
   int i = 1;
   while (iVal /= 10)
       i++;
   if (iVal % 10)
       i++;
   return i;
}

/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/
int getLengthOfInt(int iVal)
{
   return getLengthOfUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal);   //  Removemos el signo...
}

/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/
int extracNumFromInt(int iVal,          //  Numero Deseado.
                    unsigned int index //  El Indice es de Izquierda a Derecha...
                   )
{
   return extracNumFromUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal,   //  Removemos el signo...
                    index);
}

/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/
int extracNumFromUInt(unsigned int iVal,    //  Numero Deseado.
                    unsigned int index    //  El Indice es de Izquierda a Derecha...
                   )
{
   int iSize = getLengthOfUInt(iVal);
   int iRet = iVal,
       i = 0;

   if (index > iSize)                  //  ¿Indice Erroneo?.
       return ~0;
   index = (iSize - index);            //  Corregimos el indice para que se trabaje como si fueran arrays...
   if (index != iSize)                 //  ¿Debemos eliminar los digitos de la parte Izquierda?
   {
       for (i = 0; i < index; ++i)     //  Removemos
           iRet /= 10;
       for (i = 0; i < (index); ++i)   //  suplantamos por 0's
           iRet *= 10;
       iRet = (iVal - iRet);           //  Eliminamos los digitos de la izquierda...
   }
   iSize = getLengthOfUInt(iRet);
   if (iSize > 1)                      //  ¿Debemos eliminar los digitos d ela Derecha?...
       for (i = 1; i < index; ++i)
           iRet /= 10;                 //  Eliminamos...
   return iRet;                        //  Retornamos.
}

/// EntryPoint
int main(int argc, char *argv[])
{
   int i = 0;
   int iVal = -4898456;

   printf("%d\n", iVal);

   for (i = 0; i < getLengthOfInt(iVal); ++i )
       printf("%d\n", extracNumFromInt(iVal, i));

   getchar();

   return EXIT_SUCCESS;
}



Temibles Lunas!¡.
The Dark Shadow is my passion.

DickGumshoe

Cita de: BlackZeroX (Astaroth) 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.



int extracNumFromUInt(unsigned int iVal, unsigned int index);
int extracNumFromInt(int iVal, unsigned int index);
int getLengthOfUInt(unsigned int iVal);
int getLengthOfInt(int iVal);

/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/
int getLengthOfUInt(unsigned int iVal)
{
   int i = 1;
   while (iVal /= 10)
       i++;
   if (iVal % 10)
       i++;
   return i;
}

/**
Proposito:  Obtiene la longitud de un numero Decimal.
Retorno:    Longitud de el numero
NOTA:       TODO NUMERO decimal tiene una longitud minima de 1
By BlackZeroX.
**/
int getLengthOfInt(int iVal)
{
   return getLengthOfUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal);   //  Removemos el signo...
}

/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/
int extracNumFromInt(int iVal,          //  Numero Deseado.
                    unsigned int index //  El Indice es de Izquierda a Derecha...
                   )
{
   return extracNumFromUInt((0x80000000 & iVal) ? (unsigned)(~(--iVal)):(unsigned)iVal,   //  Removemos el signo...
                    index);
}

/**
Proposito:  Extre un numero DECIMAL de un numero de entero sin signo
Retorno:    Si falla retorna ~0
           Si es satisfactorio extrae el numero deseado.
By BlackZeroX.
**/
int extracNumFromUInt(unsigned int iVal,    //  Numero Deseado.
                    unsigned int index    //  El Indice es de Izquierda a Derecha...
                   )
{
   int iSize = getLengthOfUInt(iVal);
   int iRet = iVal,
       i = 0;

   if (index > iSize)                  //  ¿Indice Erroneo?.
       return ~0;
   index = (iSize - index);            //  Corregimos el indice para que se trabaje como si fueran arrays...
   if (index != iSize)                 //  ¿Debemos eliminar los digitos de la parte Izquierda?
   {
       for (i = 0; i < index; ++i)     //  Removemos
           iRet /= 10;
       for (i = 0; i < (index); ++i)   //  suplantamos por 0's
           iRet *= 10;
       iRet = (iVal - iRet);           //  Eliminamos los digitos de la izquierda...
   }
   iSize = getLengthOfUInt(iRet);
   if (iSize > 1)                      //  ¿Debemos eliminar los digitos d ela Derecha?...
       for (i = 1; i < index; ++i)
           iRet /= 10;                 //  Eliminamos...
   return iRet;                        //  Retornamos.
}

/// EntryPoint
int main(int argc, char *argv[])
{
   int i = 0;
   int iVal = -4898456;

   printf("%d\n", iVal);

   for (i = 0; i < getLengthOfInt(iVal); ++i )
       printf("%d\n", extracNumFromInt(iVal, i));

   getchar();

   return EXIT_SUCCESS;
}



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

BlackZeroX

The Dark Shadow is my passion.

DickGumshoe

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...