Matheus21 0 Denunciar post Postado Fevereiro 23, 2013 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
_Isis_ 202 Denunciar post Postado Fevereiro 23, 2013 Vc já aprendeu a utilizar ponteiros? Compartilhar este post Link para o post Compartilhar em outros sites
Matheus21 0 Denunciar post Postado Fevereiro 23, 2013 Não ainda... Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Fevereiro 23, 2013 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
Matheus21 0 Denunciar post Postado Fevereiro 24, 2013 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
_Isis_ 202 Denunciar post Postado Fevereiro 24, 2013 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
Matheus21 0 Denunciar post Postado Fevereiro 26, 2013 Fiz um pouco diferente por conta do que o enunciado pedia, mais aproveitei a ideia. Muito obrigado! Compartilhar este post Link para o post Compartilhar em outros sites