Jump to content

Contar digitos de um inteiro


rockisforkids

Recommended Posts

Rui Carlos ainda nao percebi a tua ideia.

Num forum estrangeiro acabei por descobrir que ha quem faça recurso ha funcao sprintf().

A funçao que arranjei foi a seguinte:

int countDigits(int inteiro,int max){

  char *string;

  string = (char *) calloc(max+1,sizeof(char));
  sprintf(string,"%d",inteiro);

  return strlen(string);
}

No entanto quando o primeiro digito de "inteiro" é 0, esta função não o conta. Conseguem perceber porque?

Sugeririam outro processo para fazer esta conversão?

Edit:

Triton nao consegui usar a itoa() precisamente por nao ser ANSI. Nem posso usar, no trabalho em que estou a fazer. Just ANSI! Conheces outro processo?

Link to comment
Share on other sites

No entanto quando o primeiro digito de "inteiro" é 0, esta função não o conta. Conseguem perceber porque?

Zeros à esquerda não têm qualquer significado, 100 ou 0100 significam o mesmo valor, pelo menos em base 10.

Sugeririam outro processo para fazer esta conversão?

O processo que o Rui Carlos apresentou é o mais simples.

<3 life

Link to comment
Share on other sites

O Triton tem razão, o zero à esquerda nao faz sentido nenhum... se a tua função recebe um int "inteiro", este nunca vai ter um 0 à esquerda ao passares para uma string com o sprintf.

Para além das soluções apresentadas, tens sempre a solução (para mim) mais óbvia: ir dividindo o numero por 10 enquando o numero é maior que 0...

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

  • 3 weeks later...

Desculpem la voltar a este assunto.. Pensei que ja tivesse corrigido este problema mas afinal não. Aqui vai uma descrição mais pormenorizada do meu problema:

O programa pede um numero de contribuinte (9 digitos). Qualquer coisa que o user escreva é guardado numa STRING.

Pegando nessa string, tenho de ver se o user se limitou a introduzir o numero de contribuinte ou introduziu tambem coisas indevidas (isto é, o programa tem de ser robusto).

Eu tenho que guardar o numero de contribuinte num vector de inteiros (ja que se tivesse apenas um inteiro nao poderia ter números de contrinuinte a começar por zero).

A minha duvida esta em saber como é que analiso caracter a caracter da string, ver se é um numero ou uma letra/espaco e só se for numero copia-lo para o vector de inteiros. O problema é que o atoi() trabalha melhor com strings do que caracteres, parando assim que encontra uma letra. Se fizer i = atoi©, sendo c='k' (por ex) e i um inteiro, i fica com o valor 0, o que é indesejável neste caso.

Isto parecia-me linear, mas ainda nao consegui resolver o problema e esta-me a fazer confusao...

Têm alguma sugestao?

Edit:

A hipotese do logaritmo funcionaria se tivesse logo de início um numero inteiro. Certo? (ia obtendo as suas casas decimais)

Link to comment
Share on other sites

Desculpem la voltar a este assunto.. Pensei que ja tivesse corrigido este problema mas afinal não. Aqui vai uma descrição mais pormenorizada do meu problema:

O programa pede um numero de contribuinte (9 digitos). Qualquer coisa que o user escreva é guardado numa STRING.

Pegando nessa string, tenho de ver se o user se limitou a introduzir o numero de contribuinte ou introduziu tambem coisas indevidas (isto é, o programa tem de ser robusto).

Eu tenho que guardar o numero de contribuinte num vector de inteiros (ja que se tivesse apenas um inteiro nao poderia ter números de contrinuinte a começar por zero).

A minha duvida esta em saber como é que analiso caracter a caracter da string, ver se é um numero ou uma letra/espaco e só se for numero copia-lo para o vector de inteiros. O problema é que o atoi() trabalha melhor com strings do que caracteres, parando assim que encontra uma letra. Se fizer i = atoi©, sendo c='k' (por ex) e i um inteiro, i fica com o valor 0, o que é indesejável neste caso.

Isto parecia-me linear, mas ainda nao consegui resolver o problema e esta-me a fazer confusao...

Têm alguma sugestao?

Edit:

A hipotese do logaritmo funcionaria se tivesse logo de início um numero inteiro. Certo? (ia obtendo as suas casas decimais)

Tu por acaso não andas no técnico não ? 😛

Link to comment
Share on other sites

Desculpem la voltar a este assunto.. Pensei que ja tivesse corrigido este problema mas afinal não. Aqui vai uma descrição mais pormenorizada do meu problema:

O programa pede um numero de contribuinte (9 digitos). Qualquer coisa que o user escreva é guardado numa STRING.

Pegando nessa string, tenho de ver se o user se limitou a introduzir o numero de contribuinte ou introduziu tambem coisas indevidas (isto é, o programa tem de ser robusto).

Eu tenho que guardar o numero de contribuinte num vector de inteiros (ja que se tivesse apenas um inteiro nao poderia ter números de contrinuinte a começar por zero).

A minha duvida esta em saber como é que analiso caracter a caracter da string, ver se é um numero ou uma letra/espaco e só se for numero copia-lo para o vector de inteiros. O problema é que o atoi() trabalha melhor com strings do que caracteres, parando assim que encontra uma letra. Se fizer i = atoi©, sendo c='k' (por ex) e i um inteiro, i fica com o valor 0, o que é indesejável neste caso.

Isto parecia-me linear, mas ainda nao consegui resolver o problema e esta-me a fazer confusao...

Têm alguma sugestao?

Edit:

A hipotese do logaritmo funcionaria se tivesse logo de início um numero inteiro. Certo? (ia obtendo as suas casas decimais)

Quanto a mim, o TheDark já te deu a resposta para validar o número, mas tem cuidado com o atoi porque no caso de teres um número inserido com 10 ou mais digitos (que por si só não é aceite, visto que queres números com 9 digitos), pode exceder a gama do int e dar overflow.

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.