Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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
Postado
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.

 

Postado

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;

 

 

Postado

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 

Postado
#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
  • 3 anos depois...
Postado
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
Postado

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

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...