Ir ao conteúdo
  • Cadastre-se

C Somar números gigantes em c


Posts recomendados

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
Link para o comentário
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 .

  • Curtir 1
Link para o comentário
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.

 

Link para o comentário
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;

 

 

Link para o comentário
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 

Link para o comentário
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.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...
Em 26/05/2018 às 11:15, 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 .

alguém consegue fazer isso usando if e else? Para facilitar a logica.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

desculpa, mas posso dar uma dica?
você deve tá curioso por causa de criptografia...
Mas olha, tenta comecar fazendo isso em base 2, porque ai consegue melhorar a coisa no futuro. Colocando multiplicacao e mesmo logaritmo. A arquitetura do funcionamento da maquina permitira você visualizar outra formar de operar usando >> e << nas multiplicacoes e divisoes por dois de forna mais rapida. 
 

pe por causa disso?
ai = i >= 0 ? a[i] - '0' : 0;

Procura por operadores ternarios

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...