Descomponer numero

Iniciado por sebamoron86, 8 Junio 2016, 15:38 PM

0 Miembros y 2 Visitantes están viendo este tema.

sebamoron86

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

fary

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.
Un byte a la izquierda.

sebamoron86

Muchas gracias por contestar!!

if ((c - 0x30) % 2 == 0)
No entiendo el c- 0X30

fary

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.
Un byte a la izquierda.

geeke

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));



AlbertoBSD

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.


Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW