Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

@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?

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
Postado (editado)

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;

 

 

Editado por isrnick

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
Postado (editado)
#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.

Editado por isrnick

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






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

×