Autor
|
Tema: Programa algoritmo multiplicación (Leído 5,687 veces)
|
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("introduce el primer numero"); printf("introduce la primera cifra"); printf("introduce la segunda cifra"); a=n5*n1; b=n4*n1; c=a*10+b; printf(" x %d%d \n", n4 , n5 ); }
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
Mensajes: 375
|
Bien! ¿Piensas mostrar el código o tienes algún problema en particular?
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
Ferno
Desconectado
Mensajes: 375
|
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. return 0;
|
|
|
En línea
|
|
|
|
DickGumshoe
|
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. return 0;
Muchas gracias. Intentaré hacerlo de esa forma. Muchísimas gracias. Saludos.
|
|
|
En línea
|
|
|
|
DickGumshoe
|
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("introduce el primer numero"); char n4[3]; printf("introduce la primera cifra"); b=n4[0]*n1; a=n4[1]*n1; c=a*10+b; printf(" x %d%d \n", n4 [0], n4 [1] ); 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.
|
|
« Última modificación: 26 Diciembre 2011, 19:30 pm por DickGumshoe »
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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; for (i = 0; i < getLengthOfInt(iVal); ++i ) printf("%d\n", extracNumFromInt (iVal , i )); return EXIT_SUCCESS; }
Temibles Lunas!¡.
|
|
« Última modificación: 26 Diciembre 2011, 18:59 pm por BlackZeroX (Astaroth) »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
DickGumshoe
|
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; for (i = 0; i < getLengthOfInt(iVal); ++i ) printf("%d\n", extracNumFromInt (iVal , i )); 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
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
|
|
|
En línea
|
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...
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Encontrar algoritmo de cifrado de programa de seguridad
Ingeniería Inversa
|
MaLkAvIaN_NeT
|
2
|
4,129
|
6 Abril 2006, 02:01 am
por Crack_X
|
|
|
Factor de multiplicación y FSB.
Hardware
|
alvaroons
|
4
|
7,642
|
14 Febrero 2011, 02:02 am
por alvaroons
|
|
|
Multiplicación de dos double sale 0
Programación C/C++
|
Kasswed
|
1
|
3,329
|
26 Mayo 2011, 17:59 pm
por Mr.Blue
|
|
|
ALGORITMO DE PROGRAMA A PARTIR DE CLAVE VÁLIDA (DUDA)
Hacking
|
superkini
|
2
|
3,927
|
16 Junio 2012, 00:42 am
por lapras
|
|
|
Una Ayuda con el algoritmo de un programa.
Java
|
black47
|
1
|
1,827
|
14 Noviembre 2012, 15:40 pm
por djimenez39
|
|