Hola, necesito hacer un programa que descomponga un numero de 6 cifras en pares e impares de la siguiente forma.
123456
Pares: 246
Impar: 135
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 6
int main( void )
{
int c,
i,
n,
par=0,
impar=0,
acupar=0,
acuimpar=0;
int digitos[N];
unsigned long long int num;
printf( "Escribe un numero de %d digitos como maximo: ", N );
fflush( stdout );
num = 0;
for( n = 0; n < N && (c = getchar()) != '\n'; n++ )
{
digitos[n] = c - '0';
num *= 10;
num += digitos[n];
}
printf("%d\n", num);
for( i = 0; i < n; ++i )
if(digitos[i]%2==0)
{
printf("es Par: %d\n", digitos[i]);
acupar+=digitos[i]*pow(10,par);
par++;
}
else
{
printf("es imPar: %d\n", digitos[i]);
acuimpar+=digitos[i]*pow(10,impar);
impar++;
}
printf("\npar:%d",par);
printf("\nimpar:%d",impar);
printf("\n acupar %d",acupar);
printf("\n acuimpar %d",acuimpar);
return 0;
}
Con el programa que yo escribi quería que quede el numero par e impar dado vuelta y despues ponerlo bien.
123456
Queda así 642
531
Con ese ejemplo funciona pero si pongo 123444, queda asi
4441 (en vez de 4442)
31
No entiendo porque no funciona
Te estas complicando la vida....
//Programado por fary.
#include <stdio.h>
#define N 6
int main( void )
{
int n;
char c;
int cp = 0, ci = 0;
char Pares[N] = {0};
char Impar[N] = {0};
printf( "Escribe un numero de %d digitos como maximo: ", N );
for( n = 0;(c = getchar()) != '\n'; n++ )
{
if ((c - 0x30) % 2 == 0)
{
Pares[cp] = c;
cp++;
}else{
Impar[ci] = c;
ci++;
}
}
printf("Pares: %s\nImpares: %s\n", Pares, Impar);
return 0;
}
saludos.
Muchas gracias por contestar!!
if ((c - 0x30) % 2 == 0)
No entiendo el c- 0X30
Cita de: sebamoron86 en 8 Junio 2016, 17:48 PM
Muchas gracias por contestar!!
if ((c - 0x30) % 2 == 0)
No entiendo el c- 0X30
Con eso conviertes el carácter en un número. Mira la tabla ascii.
Saludos.
Cita de: sebamoron86 en 8 Junio 2016, 15:38 PM
Con ese ejemplo funciona pero si pongo 123444, queda asi
4441 (en vez de 4442)
31
No entiendo porque no funciona
Se debe a la conversión que ocurre al asignar un double a un entero donde se produce un redondeo, debes usar
ceil() en ambos casos.
acupar += ceil(digitos[i ]* pow(10,par));
acuimpar += ceil(digitos[i] * pow(10,impar));
Cita de: fary en 8 Junio 2016, 16:55 PM
for( n = 0;(c = getchar()) != '\n'; n++ )
La solucion esta muy sencilla!!
aun asi tiene un overflow!!!
for( n = 0;(c = getchar()) != '\n' && n< 6; n++ )
Así evitamos el overflow.
el 0x30 es el caracter ascii '0'.
Podria quedar:
if ((c - '0') % 2 == 0)
Saludos.