Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Começei a estudar programação há 3 semanas e travei nessa questão:
Um programa que receba como entrada um numero inteiro N (1000 < N < 9999) em seguida imprima a quantidade de dígitos pares e ímpares que compões aquela numero, desprezando-se o zero.
Obs: onde tem < é menor ou igual.
>
Você já iniciou a construção do seu algoritmo?
Em que parte ficou travado?
Cara como to vendo programação pela 1º vez na vida e to aprendendo com C to bem travadão mas aqui vai o codigo.
Tipo as funções que aprendi até agora foi if, else, switch-case
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num1[5], par[5],impar[5];
//Entrada do numero de 4 digitos
printf("Digite um numero entre 1000-9999:\n");
scanf("%d", &num1);
if(num1<1000 || num1>9999) //Condição de existência
{
printf("Numero Invalido");
}
return 0;
}Aqui tem uma discussão sobre como verificar a quantidade de dígitos em um número:
http://stackoverflow.com/questions/1847131/how-many-digits-in-this-base
Leia até o final, porque existem comentários que analisam as respostas anteriores. Um deles menciona a diferença de todas as soluções p/ ceil(log10(n)/log10(2)).
#include <stdio.h>
int ckdig (int n, int p, int i)
{
int d = 0;
if(n < 0) n = -n;
*p = *i = 0;
while(n)
{
if((n % 2) == 0)
(*p)++;
else
(*i)++;
n /= 10;
d++;
}
return d;
}
int main (int argc, char** argv)
{
int n, p, i, d;
puts("Digite um número:");
scanf("%d", &n);
d = ckdig(n, &p, &i);
printf("Dentre os %d dígitos, há %d pares e %d ímpares.\n", d, p, i);
return 0;
}
Para saber apenas a quantidade de dígitos necessários numa conversão, use:
d = logx( n ) / logx( b )
Onde:
n é o número na base **decimal**, deverá ser arredondado;
b é a base do sistema de numeração, este para qual o número será convertido;
d é a quantidade de dígitos que serão necessários para representar n, no sistema de numeração de base b;Está formula vem do seguinte principio:
Como x = logb( n ) é equivalente a bx = n e sendo b a base do sistema de numeração de n, x representará a quantidade de digitos de n, veja:
log(255) = 2,40654018 ≅ 3, pois não há como existir 0,4 digito.
log2(1111 1111) = 7,994353437 ≅ 8
log16(FF) = 1,998588359 ≅ 2
Deveras não é prático usar log16 ou logx, para tornar mais prático o uso dos logaritimos, vamos usar a fórmula de mudança de base:
logb( x ) = loga( x ) / loga( b )
Então chegamos a fórmula:
d = logx( n ) / logx( b )
Por isto que é bom gostar de matemática!
Boa sorte!
Correção:
>
#include <stdio.h>
int ckdig (int n, int p, int i)
{
int d = 0;
if(n < 0) n = -n;
*p = *i = 0;
while(n)
{
if((n % 2) == 0)
(*p)++;
else
(*i)++;
n /= 10;
d++;
}
return d;
}
int main (int argc, char** argv)
{
int n, p, i, d;
puts("Digite um número:");
scanf("%d", &n);
d = ckdig(n, &p, &i);
printf("Dentre os %d dígitos, há %d pares e %d ímpares.\n", d, p, i);
return 0;
}
Para saber apenas a quantidade de dígitos necessários numa conversão, use:
d = logx( n ) / logx( b )
Onde:
n é o número na base **decimal**, deverá ser arredondado;
b é a base do sistema de numeração, este para qual o número será convertido;
d é a quantidade de dígitos que serão necessários para representar n, no sistema de numeração de base b, deverá ser arredondado;Está formula vem do seguinte principio:
Como x = logb( n ) é equivalente a bx = n e sendo b a base do sistema de numeração de n, x representará a quantidade de digitos de n, veja:
log(255) = 2,40654018 ≅ 3, pois não há como existir 0,4 digito.
log2(1111 1111) = 7,994353437 ≅ 8
log16(FF) = 1,998588359 ≅ 2
Deveras não é prático usar log16 ou logx, para tornar mais prático o uso dos logaritimos, vamos usar a fórmula de mudança de base:
logb( x ) = loga( x ) / loga( b )
Então chegamos a fórmula:
d = logx( n ) / logx( b )
Por isto que é bom gostar de matemática!
Boa sorte!
/*
Copyright 2013 Mateus G Pereira
Licença: GNU GPL v3 ou maior
http://www.gnu.org/licenses/gpl.html
*/
#include <stdio.h>
int ckdig (int n, int p, int i)
{
int d = 0;
if(n < 0) n = -n;
*p = *i = 0;
while(n)
{
if((n % 2) != 0)
(*i)++;
else if((n % 10) != 0)
(*p)++;
n /= 10;
d++;
}
return d;
}
inline int _abs (int n)
{
return (n < 0) ? -n:n;
}
int digits (int val, int base)
{
register int digs = 0, n;
n = _abs(val);
do
{
n /= base;
digs++;
}while(n);
return digs;
}
int main (int argc, char** argv)
{
int n, p, i, d;
puts("Digite um número:");
scanf("%d", &n);
d = ckdig(n, &p, &i);
printf("Dentre os %d dígitos, há %d pares e %d ímpares.\n", d, p, i);
printf("Correto? %d = %d?\n", d, digits(n, 10));
return 0;
}
Algumas correções no código.
Você já iniciou a construção do seu algoritmo?
Em que parte ficou travado?