Ir ao conteúdo
  • Cadastre-se
marcos12345

C Somar números gigantes em c

Recommended Posts

Galera vcs podem me ajudar nesse problema que é somar números muito grande em c eu tentei fazer mas mas não deu certo veja o código abaixo: 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char a[1000];
    char b[1000];
    int soma[1000],b2[1000],a2[1000],i,tam1,tam2,j,n=0,aux=0;
    printf("Digite um numero:\n");
    scanf("%s",a);
    printf("Digite um sequndo numero:\n");
    scanf("%s",b);
    tam1=strlen(a);
    tam2=strlen(b);
    for(i=tam1-1,j=tam2-1;i>=0,j>=0; i--,j--){
        a2[i]=a[i]-'0';
        b2[i]=b[j]-'0';
        soma[i]=a2[i]+b2[i]+aux;
        aux=0;
        if(i!=0){
            if(soma[i]>=10){
                soma[i]=soma[i]%10;
                aux=1;
            }
        }
        n++;
    }
    for(i=0; i<n; i++){
        printf("%d",soma[i]);
    }
    return 0;
}

Ele funciona quando é numeros que tem a mesma quantidade de algorismo por exemplo:

123456+123456=246912

mas quando é um numero em que o numero de algarismo é diferente não funciona

123456+123=000 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei interessante a ideia, acabei fazendo assim:

 

#include <stdio.h>
#include <string.h>

int main()
{
    char a[1000], b[1000], soma[1000];
    int i, j, k, tama, tamb, tams, aux=0, ai, bi, s;
    
    printf("Digite um numero:\n");
    scanf("%1000s%*c", a);
    printf("\nDigite um sequndo numero:\n");
    scanf("%1000s%*c", b);
    
    tama = strlen(a);
    tamb = strlen(b);
    //Tamanho da soma é 1 a mais que o maior número entre tamanho de a e de b:
    tams = (tama > tamb ? tama : tamb) + 1;
    
    soma[tams] = '\0'; //Fim da string soma
    for(i=tama-1, j=tamb-1, k=tams-1; k >= 0; i--, j--, k--){
        ai = i >= 0 ? a[i] - '0' : 0; //Se ainda está dentro do vetor converte o
        bi = j >= 0 ? b[j] - '0' : 0; //caractere para inteiro, senão guarda 0.
        s = ai + bi + aux; //Soma
        soma[k] = s % 10 + '0'; //Guarda apenas 1 digito como caractere
        aux = s / 10; //Carrega o que sobrou para somar no próximo ciclo
    }
    
    //Elimina o zero à esquerda da soma, se o último aux não carregou nada:
    if(soma[0] == '0'){
        for(i=0; soma[i]; i++){ //move todos os caracteres 1 posição
            soma[i] = soma[i+1];
        }
    }

    printf("\nSoma: \n%s\n", soma);
    
    return 0;
}

Usei operadores ternários .

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 minutos atrás, isrnick disse:

Achei interessante a ideia, acabei fazendo assim:

 


#include <stdio.h>
#include <string.h>

int main()
{
    char a[1000], b[1000], soma[1000];
    int i, j, k, tama, tamb, tams, aux=0, ai, bi, s;
    
    printf("Digite um numero:\n");
    scanf("%1000s%*c", a);
    printf("\nDigite um sequndo numero:\n");
    scanf("%1000s%*c", b);
    
    tama = strlen(a);
    tamb = strlen(b);
    //Tamanho da soma é 1 a mais que o maior número entre tamanho de a e de b:
    tams = (tama > tamb ? tama : tamb) + 1;
    
    soma[tams] = '\0'; //Fim da string soma
    for(i=tama-1, j=tamb-1, k=tams-1; k >= 0; i--, j--, k--){
        ai = i >= 0 ? a[i] - '0' : 0; //Se ainda está dentro do vetor converte o
        bi = j >= 0 ? b[j] - '0' : 0; //caractere para inteiro, senão guarda 0.
        s = ai + bi + aux; //Soma
        soma[k] = s % 10 + '0'; //Guarda apenas 1 digito como caractere
        aux = s / 10; //Carrega o que sobrou para somar no próximo ciclo
    }
    
    //Elimina o zero à esquerda da soma, se o último aux não carregou nada:
    if(soma[0] == '0'){
        for(i=0; soma[i]; i++){ //move todos os caracteres 1 posição
            soma[i] = soma[i+1];
        }
    }

    printf("\nSoma: \n%s\n", soma);
    
    return 0;
}

Usei operadores ternários .

Me explicar melhor essa parte 

 

13 minutos atrás, isrnick disse:

tams = (tama > tamb ? tama : tamb) + 1;

E essa 

14 minutos atrás, isrnick disse:

ai = i >= 0 ? a[i] - '0' : 0; //Se ainda está dentro do vetor converte o

bi = j >= 0 ? b[j] - '0' : 0; //caractere para inteiro, senão guarda 0.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
47 minutos atrás, isrnick disse:

@Marcos Paulo feitosa Você já aprendeu sobre operadores ternários? Eu coloquei um link pra um site explicando como funcionam. Ou sua dúvida é sobre a lógica?

É sobre a logica que eu não entendi mito bem

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resultado da soma entre 2 números positivos ou terá o mesmo número de dígitos do mais longo dos 2 números, ou 1 dígito a mais se carregar 1.


Ex:

999 tem 3 dígitos
10 tem 2 dígitos

999 + 10 = 1009

1009 tem 4 dígitos (3 + 1)

 

Então para obter o comprimento/tamanho da string que compõe a soma dos 2 números o programa verifica qual dos 2 comprimentos é maior, pega o maior e soma +1:

tams = (tama > tamb ? tama : tamb) + 1;

 

 

Os índices dos vetores só vão até 0, não existem índices negativos, então para compensar pela diferença entre os comprimentos dos números digitados, eu faço ele verificar se o índice i (que usamos para acessar a[ i ] ) ainda é maior que 0, se for maior ele converte o dígito da casa para inteiro subtraindo o caractere '0', se não for então apenas assume o valor 0 (zero):

ai = i >= 0 ? a[i] - '0' : 0;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara aproveitando o tópico eu tava tentando fazer uma subtração com essa mesma ideia ai eu conseguir fazer a subtração mas na hora em que eu subtraio dois numero iguais como por exemplo 111 - 111 erra para dar so 0 mas dar 000 eu queria saber como remover esses zeros e deixar apenas um zero 

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <string.h>

int main()
{
    char subtracao[1000] = "00000";
    int tamsu, i;
    
    tamsu = strlen(subtracao);
    for(i = 0; subtracao[i] == '0' && i < tamsu-1; i++);
    strcpy(subtracao, &subtracao[i]);

    printf("%s", subtracao);

    return 0;
}

Faça testes modificando os dígitos na string, funciona para qualquer número, e veja se consegue entender o que fiz. Se tiver dúvidas é só perguntar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×