Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: sebamoron86 en 8 Junio 2016, 15:38 pm



Título: Descomponer numero
Publicado por: sebamoron86 en 8 Junio 2016, 15:38 pm
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

Código:
#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


Título: Re: Descomponer numero
Publicado por: fary en 8 Junio 2016, 16:55 pm
Te estas complicando la vida....

Código
  1. //Programado por fary.
  2.  
  3. #include <stdio.h>
  4. #define N 6
  5.  
  6. int main( void )
  7. {
  8.    int n;
  9.    char c;
  10.    int cp = 0, ci = 0;
  11.    char Pares[N] = {0};
  12.    char Impar[N] = {0};
  13.  
  14.    printf( "Escribe un numero de %d digitos como maximo: ", N );
  15.  
  16.    for( n = 0;(c = getchar()) != '\n'; n++ )
  17.    {
  18.        if ((c - 0x30) % 2 == 0)
  19.        {
  20.            Pares[cp] = c;
  21.            cp++;
  22.        }else{
  23.            Impar[ci] = c;
  24.            ci++;
  25.        }
  26.    }
  27.  
  28.    printf("Pares: %s\nImpares: %s\n", Pares, Impar);
  29.    return 0;
  30. }
  31.  

saludos.


Título: Re: Descomponer numero
Publicado por: sebamoron86 en 8 Junio 2016, 17:48 pm
Muchas gracias por contestar!!

Código:
if ((c - 0x30) % 2 == 0)
No entiendo el c- 0X30


Título: Re: Descomponer numero
Publicado por: fary en 8 Junio 2016, 19:15 pm
Muchas gracias por contestar!!

Código:
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.


Título: Re: Descomponer numero
Publicado por: geeke en 8 Junio 2016, 19:30 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.

Código
  1. acupar += ceil(digitos[i ]* pow(10,par));
  2. acuimpar += ceil(digitos[i] * pow(10,impar));



Título: Re: Descomponer numero
Publicado por: AlbertoBSD en 9 Junio 2016, 01:49 am
Código
  1.    for( n = 0;(c = getchar()) != '\n'; n++ )
  2.  
  3.  

La solucion esta muy sencilla!!

aun asi tiene un overflow!!!

Código
  1. for( n = 0;(c = getchar()) != '\n' && n< 6; n++ )

Así evitamos el overflow.

el 0x30 es el caracter ascii '0'.

Podria quedar:

Código
  1. if ((c - '0') % 2 == 0)

Saludos.