Problema con ejercicio de vectores

Iniciado por Draked393, 15 Diciembre 2013, 18:42 PM

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

Draked393

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:
#include <stdio.h>
#include <stdlib.h>

int main()
{
int *v1=0, i,*v2=0,j, *Vt, k ;
size_t espai1=0;
size_t espai2=0;
size_t espai3=0;

printf("Digues quantes xifres té el primer numero: ");
scanf("%d", &espai1);
printf("Digues quantes xifres té el segon numero: ");
scanf("%d", &espai2);

//Per a adjudicar el tamany dels vectors
v1 = (int *)malloc( espai1*sizeof(int) );
v2 = (int *)malloc( espai2*sizeof(int) );
Vt = (int *)malloc( espai3*sizeof(int) );
// Dar la cantidad de numeros

printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
for( i=0; i<espai1;i++)
{
scanf("%d", &v1[i]);
}

printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
for(j=0; j<espai2; j++)
{
scanf("%d", &v2[j]);
}

//Poner los numeros en un orden inverso

for(i=espai1-1; i>=0; i--)
{
printf("%d\t", v1[i]);
}
for(j=espai2-1; j>=0;j--)
{
printf("%d\t", v2[j]);
}

//Suma
for (i=0; i< espai1; i++)
{
for(j=0; j<espai2; j++)
{
for(k=0; k<espai3+1; k ++)
{
Vt[k] = v1[i] + v2[j];
if(Vt[k]>9)
{
k++;
Vt[k]= Vt[k] + 1;
}
printf("El resultat de la suma es : %d\n", Vt[k]);
}
}
}
// Ordenar el resultado
for (k=espai3-1; k>=0; k--)
{
printf("%d\t", Vt[k]);
}

return 0;
}


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.

amchacon

¿Y cual es el error exactamente? Para ir al grano ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Draked393

no me realiza la operación bien. Supongo que no esta bien hecha..

amchacon

Cita de: Draked393 en 15 Diciembre 2013, 18:48 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?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#4


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 (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main()
{
int *v1=0, i,*v2=0,j, *Vt, k ,ch;
int espai1=0, espai2=0, espai3=0;

printf("Digues quantes xifres té el primer numero: ");
scanf("%d", &espai1);
printf("Digues quantes xifres té el segon numero: ");
scanf("%d", &espai2);
   if (espai1 >= espai2)
       espai3=espai1;
   else
       espai3=espai2;
//Per a adjudicar el tamany dels vectors
v1 = (int *)malloc( espai3*sizeof(int) );
v2 = (int *)malloc( espai3*sizeof(int) );
Vt = (int *)malloc( espai3*sizeof(int) );
for (i=0;i<espai2;i++)
           v1[i]=v2[i]=0;
       // Dar la cantidad de numeros

printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
for( i=0; i<espai1;i++)
{
scanf("%d", &v1[i]);
}

printf("Digues els numeros de la suma (separa cada numero amb un espai): ");
for(j=0; j<espai2; j++)
{
scanf("%d", &v2[j]);
}

//Poner los numeros en un orden inverso

for(i=espai1-1; i>=0; i--)
{
printf("v1[%d]=%d\t", i,v1[i]);
}
puts("\n");
for(j=espai2-1; j>=0;j--)
{
printf("v2[%d]=%d\t", j,v2[j]);
}

//Suma
for(k=0; k<espai3; k ++)
{
Vt[k] =0;
Vt[k] = v1[k] + v2[k];
if(Vt[k]>9)
{
k++;
Vt[k]= Vt[k] + 1;
}
printf("\nEl resultat de la suma es Vt[%d]= %d\n",k, Vt[k]);
}

// Ordenar el resultado
puts("\nLa suma es:");
for (k=0; k<espai3; k++)
{
printf("%d ", Vt[k]);//system("pause");
}

return 0;
}


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

leosansan

#5
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 (cpp) [Seleccionar]

#include <stdio.h>

int main()
{
int i,j, k ,ch;
int digito1=0, digito2=0, digito_suma=0;
printf("Diga cuantas cifras tiene el primer numero: ");
scanf("%d", &digito1);
printf("Diga cuantas cifras tiene el segundo numero: ");
scanf("%d", &digito2);
   if (digito1 >= digito2)
       digito_suma=digito1;
   else
       digito_suma=digito2;
int v1[digito_suma+1],v2[digito_suma+1],Vt[digito_suma+1];
   for (i=0;i<digito_suma;i++)
       v1[i]=v2[i]=0;
   for (i=0;i<=digito_suma+1;i++)
       Vt[i]=0;

printf("Indique los digitos del primer numero: \n");
for( i=0; i<digito1;i++){
if (digito1<digito2)
           scanf("%d", &v1[i+digito2-digito1+1]);
       else
           scanf("%d", &v1[i+1]);
}
printf("Indique los digitos del segundo numero: \n");
for(i=0; i<digito2; i++){
if (digito2<digito1)
           scanf("%d", &v2[i+digito1-digito2+1]);
       else
           scanf("%d", &v2[i+1]);
}
for(i=0; i<=digito_suma; i++)
printf("v1[%d]=%d\t", i,v1[i]);
puts("\n");
for(i=0; i<=digito_suma;i++)
printf("v2[%d]=%d\t", i,v2[i]);
//Suma
puts("\n");
for(k=digito_suma; k>=0; k--){
       Vt[k] = Vt[k]+ v1[k] + v2[k];
       if(Vt[k]>9){
           Vt[k]-= 10;
           Vt[k-1]+= 1;
       }
       printf("\nEl resultado de la suma es Vt[%d]= %d\n",k, Vt[k]);
   }
puts("\nLa suma es:");
for (k=0; k<=digito_suma; k++)
printf("%d ", Vt[k]);
return 0;
}


Saluditos! ..... !!!!