Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
Não ainda...
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.
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");
}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.
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.
Fiz um pouco diferente por conta do que o enunciado pedia, mais aproveitei a ideia. Muito obrigado!
Vc já aprendeu a utilizar ponteiros?