Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Draked393 en 15 Diciembre 2013, 18:42 pm



Título: Problema con ejercicio de vectores
Publicado por: Draked393 en 15 Diciembre 2013, 18:42 pm
Buenas, llevo 4 horas con este ejercicio de vectores y no soy capaz de sacarlo...

"31. La suma.Para operar con números naturales muy grandes se pueden utilizar vectores qeu tengan como componentes los dígitos decimales entre 0 y 9, que serán los dígitos del numero. Escribe un programa que sume dos números natura de hasta X cifras. Para cada número se preguntara la cantidad de cifras que tiene. "

Esto es lo que tengo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. int *v1=0, i,*v2=0,j, *Vt, k ;
  7. size_t espai1=0;
  8. size_t espai2=0;
  9. size_t espai3=0;
  10.  
  11. printf("Digues quantes xifres té el primer numero: ");
  12. scanf("%d", &espai1);
  13. printf("Digues quantes xifres té el segon numero: ");
  14. scanf("%d", &espai2);
  15.  
  16. //Per a adjudicar el tamany dels vectors
  17. v1 = (int *)malloc( espai1*sizeof(int) );
  18. v2 = (int *)malloc( espai2*sizeof(int) );
  19. Vt = (int *)malloc( espai3*sizeof(int) );
  20. // Dar la cantidad de numeros
  21.  
  22. printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
  23. for( i=0; i<espai1;i++)
  24. {
  25. scanf("%d", &v1[i]);
  26. }
  27.  
  28. printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
  29. for(j=0; j<espai2; j++)
  30. {
  31. scanf("%d", &v2[j]);
  32. }
  33.  
  34. //Poner los numeros en un orden inverso
  35.  
  36. for(i=espai1-1; i>=0; i--)
  37. {
  38. printf("%d\t", v1[i]);
  39. }
  40. for(j=espai2-1; j>=0;j--)
  41. {
  42. printf("%d\t", v2[j]);
  43. }
  44.  
  45. //Suma
  46. for (i=0; i< espai1; i++)
  47. {
  48. for(j=0; j<espai2; j++)
  49. {
  50. for(k=0; k<espai3+1; k ++)
  51. {
  52. Vt[k] = v1[i] + v2[j];
  53. if(Vt[k]>9)
  54. {
  55. k++;
  56. Vt[k]= Vt[k] + 1;
  57. }
  58. printf("El resultat de la suma es : %d\n", Vt[k]);
  59. }
  60. }
  61. }
  62. // Ordenar el resultado
  63. for (k=espai3-1; k>=0; k--)
  64. {
  65. printf("%d\t", Vt[k]);
  66. }
  67.  
  68. return 0;
  69. }

Lo que he hecho a sido primero como se puede ver, crear los vectores sin un tamaño, despues pedir el tamaño de dichos vectores.
Para poder hacer la suma sin complicarme demasiado, se me ha ocurrido la idea de pasar los números al orden inverso y luego volver a pasar el resultado.

Si alguien me puede ayudar se lo agradecería.


Título: Re: Problema con ejercicio de vectores
Publicado por: amchacon en 15 Diciembre 2013, 18:45 pm
¿Y cual es el error exactamente? Para ir al grano ;)


Título: Re: Problema con ejercicio de vectores
Publicado por: Draked393 en 15 Diciembre 2013, 18:48 pm
no me realiza la operación bien. Supongo que no esta bien hecha..


Título: Re: Problema con ejercicio de vectores
Publicado por: amchacon en 15 Diciembre 2013, 18:49 pm
no me realiza la operación bien. Supongo que no esta bien hecha..
Supongo. ¿Pero que datos le has metido y que valor te sale?


Título: Re: Problema con ejercicio de vectores
Publicado por: leosansan en 15 Diciembre 2013, 20:17 pm


Una muestra de que el código si puede funcionar:


Citar
Digues quantes xifres tÚ el primer numero: 2
Digues quantes xifres tÚ el segon numero: 2
Digues els numeros de la suma (separa cada numero amb un espai): 1
3
Digues els numeros de la suma (separa cada numero amb un espai): 4
5
v1[1]=3 v1[0]=1

v2[1]=5 v2[0]=4
El resultat de la suma es Vt[0]= 5

El resultat de la suma es Vt[1]= 8

La suma es:
5 8

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6. int *v1=0, i,*v2=0,j, *Vt, k ,ch;
  7. int espai1=0, espai2=0, espai3=0;
  8.  
  9. printf("Digues quantes xifres té el primer numero: ");
  10. scanf("%d", &espai1);
  11. printf("Digues quantes xifres té el segon numero: ");
  12. scanf("%d", &espai2);
  13.    if (espai1 >= espai2)
  14.        espai3=espai1;
  15.    else
  16.        espai3=espai2;
  17. //Per a adjudicar el tamany dels vectors
  18. v1 = (int *)malloc( espai3*sizeof(int) );
  19. v2 = (int *)malloc( espai3*sizeof(int) );
  20. Vt = (int *)malloc( espai3*sizeof(int) );
  21. for (i=0;i<espai2;i++)
  22.            v1[i]=v2[i]=0;
  23.        // Dar la cantidad de numeros
  24.  
  25. printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
  26. for( i=0; i<espai1;i++)
  27. {
  28. scanf("%d", &v1[i]);
  29. }
  30.  
  31. printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
  32. for(j=0; j<espai2; j++)
  33. {
  34. scanf("%d", &v2[j]);
  35. }
  36.  
  37. //Poner los numeros en un orden inverso
  38.  
  39. for(i=espai1-1; i>=0; i--)
  40. {
  41. printf("v1[%d]=%d\t", i,v1[i]);
  42. }
  43. puts("\n");
  44. for(j=espai2-1; j>=0;j--)
  45. {
  46. printf("v2[%d]=%d\t", j,v2[j]);
  47. }
  48.  
  49. //Suma
  50. for(k=0; k<espai3; k ++)
  51. {
  52. Vt[k] =0;
  53. Vt[k] = v1[k] + v2[k];
  54. if(Vt[k]>9)
  55. {
  56. k++;
  57. Vt[k]= Vt[k] + 1;
  58. }
  59. printf("\nEl resultat de la suma es Vt[%d]= %d\n",k, Vt[k]);
  60. }
  61.  
  62. // Ordenar el resultado
  63. puts("\nLa suma es:");
  64. for (k=0; k<espai3; k++)
  65. {
  66. printf("%d ", Vt[k]);//system("pause");
  67. }
  68.  
  69. return 0;
  70. }
  71.  

Pero tal como está suma números de iguales cifras -puedes solventar el problema introduciendo ceros al de menos cifras o mejor modificando el código pata tener en cuenta esta opción- ,. Tienes que arreglar lo anterior y también tienes que arreglar cuando sumen dos dígitos más de nueve. Como está no furula.  :rolleyes:

Pero ese no es el único de tus problemas ya que la dimensión de la suma debería ser "espai3+1", en previsión de lo que te comenté de que la suma de las cifras más significativas sea superior a 9.  :silbar:


Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Problema con ejercicio de vectores
Publicado por: leosansan en 17 Diciembre 2013, 16:13 pm
Posteo como nuevo porque he introducido las mejoras que indiqué en el post anterior.

Ya se pueden introducir números con distinto número de cifras, queda solventado el problema del número total de cifras y el echo de que sumen dos dígitos más de nueve.

No es exactamente como yo resolvería este problema de la suma de dos enteros con un número cualquiera de cifras pero tampoco quería modificar drástica mente el código original. Bueno un poquito sí, como el idioma para enterarme mejor de lo que hacia  :silbar:

La "potencia" del código está en que puede sumar enteros de 30, 100 o más dígitos, cosa que como "int" en C no se puede hacer.

Y para muestra un botón:


Citar
Diga cuantas cifras tiene el primer numero: 3
Diga cuantas cifras tiene el segundo numero: 4
Indique los digitos del primer numero:
6
3
9
Indique los digitos del segundo numero:
9
8
7
5
v1[0]=0 v1[1]=0 v1[2]=6 v1[3]=3 v1[4]=9

v2[0]=0 v2[1]=9 v2[2]=8 v2[3]=7 v2[4]=5


El resultado de la suma es Vt[4]= 4

El resultado de la suma es Vt[3]= 1

El resultado de la suma es Vt[2]= 5

El resultado de la suma es Vt[1]= 0

El resultado de la suma es Vt[0]= 1

La suma es:
1 0 5 1 4
*/

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int i,j, k ,ch;
  6. int digito1=0, digito2=0, digito_suma=0;
  7. printf("Diga cuantas cifras tiene el primer numero: ");
  8. scanf("%d", &digito1);
  9. printf("Diga cuantas cifras tiene el segundo numero: ");
  10. scanf("%d", &digito2);
  11.    if (digito1 >= digito2)
  12.        digito_suma=digito1;
  13.    else
  14.        digito_suma=digito2;
  15. int v1[digito_suma+1],v2[digito_suma+1],Vt[digito_suma+1];
  16.    for (i=0;i<digito_suma;i++)
  17.        v1[i]=v2[i]=0;
  18.    for (i=0;i<=digito_suma+1;i++)
  19.        Vt[i]=0;
  20.  
  21. printf("Indique los digitos del primer numero: \n");
  22. for( i=0; i<digito1;i++){
  23. if (digito1<digito2)
  24.            scanf("%d", &v1[i+digito2-digito1+1]);
  25.        else
  26.            scanf("%d", &v1[i+1]);
  27. }
  28. printf("Indique los digitos del segundo numero: \n");
  29. for(i=0; i<digito2; i++){
  30. if (digito2<digito1)
  31.            scanf("%d", &v2[i+digito1-digito2+1]);
  32.        else
  33.            scanf("%d", &v2[i+1]);
  34. }
  35. for(i=0; i<=digito_suma; i++)
  36. printf("v1[%d]=%d\t", i,v1[i]);
  37. puts("\n");
  38. for(i=0; i<=digito_suma;i++)
  39. printf("v2[%d]=%d\t", i,v2[i]);
  40. //Suma
  41. puts("\n");
  42. for(k=digito_suma; k>=0; k--){
  43.        Vt[k] = Vt[k]+ v1[k] + v2[k];
  44.        if(Vt[k]>9){
  45.            Vt[k]-= 10;
  46.            Vt[k-1]+= 1;
  47.        }
  48.        printf("\nEl resultado de la suma es Vt[%d]= %d\n",k, Vt[k]);
  49.    }
  50. puts("\nLa suma es:");
  51. for (k=0; k<=digito_suma; k++)
  52. printf("%d ", Vt[k]);
  53. return 0;
  54. }
  55.  

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)