Test Foro de elhacker.net SMF 2.1

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

#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....

//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.
Título: Re: Descomponer numero
Publicado por: sebamoron86 en 8 Junio 2016, 17:48 PM
Muchas gracias por contestar!!

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

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


Título: Re: Descomponer numero
Publicado por: AlbertoBSD en 9 Junio 2016, 01:49 AM
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.