Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matheus21

Soma de vetores

Recommended Posts

Olá, boa tarde a todos.

 

Estou fazendo um trabalho na linguagem C, o enunciado pede várias funções... To travado em uma delas. Um breve resumo...

 

É um programa usado pra fazer operações com numeros "grandes" (que não cabem num int), primeiro li um vetor de caracteres e transformei ele num vetor de inteiros. O numero é armazenado de trás pra frente no vetor, começando pela casa da unidade na posição x[1] e assim por diante, pra facilitar as operações. Na primeira posição do vetor é armazenado o numero de algarismos do "grande" (que eu contei antes na função)

 

Agora o enunciado pede que se faça uma função que some dois "grandes". O que eu fiz:

 

 

void somaGrande (int x[], int y[], int s[]) {
    int n, j, vai = 0;
    leia (x);
    leia (y);
    if (x[0] > y[0])
      n = x[0];
    else
      n = y[0];
    for (j = 1; j < n + 1; j = j + 1) {
      s[j] = (x[j] + y[j] + vai) % 10;
      vai = (x[j] + y[j] + vai) / 10;
    }
    for (j = n; j > 0; j = j - 1) {
      printf ("%d", s[j]);
    }
    printf ("\n");
  }

 

 

Essa variavel vai serve pra quando a soma de x[j] + y[j] for maior ou igual a 10. Só que meu problema é quando após a soma o numero ganha um algarismo a mais.

 

Tipo se for 999 + 999 = 1998, na saída ele devolve 998, pois o n aumenta e eu não consigo prever qual vai ser o tamanho a após a soma e onde armazenar caso for.

 

Acho que ficou meio confuso como eu expliquei, mais se alguém puder ajudar posso melhorar aos poucos, postar o resto do codigo...

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que vc pode fazer é criar um array com m+n+1 posições e iniciar tudo com zero. Conforme vc for fazendo as contas, vai trocando os valores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que eles precisam andar separados, tenho dois indices: Um para o vetor s que recebe a soma dos grandes, e outro para x e y que são os grandes. Porque na primeira posição do x e y tem o seu numero de algarismos, esse numero não entra na conta.

 

 

void somaGrande (int x[], int y[], int s[]) {
    int n, j, i, vai;
    leia (x);
    leia (y);
    if (x[0] > y[0])
      n = x[0] + 1;
    else
      n = y[0] + 1;
    for (j = 0, i = 1; j < n; j = j + 1, i = i + 1) {
      s[j] = (x[i] + y[i] + vai) % 10;
      vai = (x[i] + y[i] + vai) / 10;
    }
    n = j;
    for (j = n - 1; j >= 0; j = j - 1) {
      printf ("%d", s[j]);
    }
    printf ("\n");
  }

Então eu atribui a n o numero de algarismos do maior entre os dois grandes mais 1, pra fica como posição extra caso o grande aumente na operação. O problema é se ele não aumentar, fica imprimindo o zero na frente que é o valor da posição inutilizada.

 

Para as entradas:

 

999

999

 

O resultado é 1998, como ambos tem 3 algarismos, o n tem mais um pois após a soma ele vai virar 4. Agora se não for aumentar, por exemplo, fica assim:

 

Pras entradas:

 

27452

27452

 

Saída: 054904

 

Eu não sei como eu resolvo essa parte, pra independente do numero que eu somar, todo mundo ficar no seu lugar...

 

Os vetores todos tem 1002 posições, pois esse é o limite do grande.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

void somaGrande(int a[], int tam_a, int b[], int tam_b) {
   int total[tam_a+tam_b+1];
   memset(&total, 0, tam_a+tam_b+1);
   int indice_a = tam_a-1, indice_b = tam_b-1;
   int indice_total = tam_a+tam_b;
   int sobra = 0;
 
   while(indice_a >= 0 && indice_b >= 0 && indice_total >=0) {
       total[indice_total] = (a[indice_a] + b[indice_b] + sobra) % 10;
       sobra = (a[indice_a] + b[indice_b] + sobra) / 10;
       indice_a--;
       indice_b--;
       indice_total--;
   }
 
  // Apenas cópia dos dígitos que sobraram das parcelas.
   while (indice_a >= 0) {
      total[indice_total] = (a[indice_a] +  sobra) % 10;
      sobra = (a[indice_a] + sobra) / 10;
      indice_a--;
      indice_total--;
    }
 
    while (indice_b >= 0) {
      total[indice_total] = (b[indice_b] +  sobra) % 10;
      sobra = (b[indice_b] + sobra) / 10;
      indice_b--;
      indice_total--;
    }
 
    // Cópia da "sobra"
    total[indice_total] = sobra;
}

 

É mais ou menos assim que pensei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.