[Curso] Introducción a la programación en C (VIII)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Chacaritas
Enteradillo
Enteradillo
Mensajes: 41
Registrado: 03 Abr 2010, 03:03

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por Chacaritas »

Aqui esta el .pdf :oki:
Saludos!!
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por dRoLl3R »

Muy buenas otra vez.
Siento no haber hecho nada desde hace tiempo pero es que entre exámenes, el tiempo para salir, estar con la novia, etc. No he tenido mucho tiempo para programar sin embargo en clase he estado pensando como optimizar el ejercicio IV.
Haber que opinas profe que en este no se miran infinitos números sino solo los impares hasta el propio numero por lo que quité muuuuuuuchos números xD
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
    int i, k, contador, divisor, num;

    printf("Introduce un numero entero mayor que 1 y te dire si es primo o no: ");
    scanf("%d", &num);

    else if (num <= 1)
       printf("El %d no entra en el rango.", num);

    if (num == 2)
       printf("El 2 es un numero primo.");

    else if (num % 2 == 0)
       printf("El %d no es un numero primo. Es divisible por 2.", num);

    else if (num == 3)
       printf("El 3 es un numero primo.");

    else
    {
        i = 3;
        while (i<num)
        {
              contador = 0;
              k = i;
              while (k<num)
              {
                    contador++;

                    if (contador == 1)
                       divisor = k;

                    k = k + i;
              }
              if (k == num)
                 i = num;

              i = i + 2;
        }
        if (contador == 1)
           printf("El %d es un numero primo.", num);
        else
           printf("El %d no es un numero primo. Es divisible por %d.", num, divisor);
    }       
   
    return 0;
}

Lo habría hecho con for que es mas cómodo y mas agradable a la vista xD pero como es de cursos posteriores lo hice con while.
Un saludo a todos.

EDITO: modificado contador = contador + 1 por contador++

EDITO2: Los numero menores que el 1 y el 1 no están en el rango. ;)
Última edición por dRoLl3R el 14 Abr 2010, 17:18, editado 2 veces en total.
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Chacaritas
Enteradillo
Enteradillo
Mensajes: 41
Registrado: 03 Abr 2010, 03:03

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por Chacaritas »

Pudiste haber puesto

Código: Seleccionar todo

contador++
//Que es lo mismo que contador = contador + 1 pero aun así lo veo muy bien . ..

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

Una solución muy elegante Droller, realmente me ha gustado :adora: Es muy bueno evitar las divisiones, ya que es posiblemente la operación más lenta.

Sólo un pequeño detalle: el 1 ni es primo ni no lo es. Está fuera del dominio a contemplar. Además de falta comprobar las entradas incorrectas (<= 1).

Aparte de esto, aún se puede optimizar más. El bucle principal while (i<num), se puede hacer más corto (que no se ejecute tantas veces ;) ). A ver si das con la solución (que es en realidad muy sencilla).
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por dRoLl3R »

Chacaritas escribió:Pudiste haber puesto

Código: Seleccionar todo

contador++
//Que es lo mismo que contador = contador + 1 pero aun así lo veo muy bien . ..

Si tienes razón no me había dado cuenta, sería por haber puesto el i=i+2 y el k=k+i que no me acorde de eso xD Lo voi a editar que así queda mas legible ;)


EDITO:
m0skit0 escribió:Una solución muy elegante Droller, realmente me ha gustado :adora: Es muy bueno evitar las divisiones, ya que es posiblemente la operación más lenta.

Sólo un pequeño detalle: el 1 ni es primo ni no lo es. Está fuera del dominio a contemplar. Además de falta comprobar las entradas incorrectas (<= 1).

Aparte de esto, aún se puede optimizar más. El bucle principal while (i<num), se puede hacer más corto (que no se ejecute tantas veces ;) ). A ver si das con la solución (que es en realidad muy sencilla).
:shock: siempre se puede optimizar más por lo que veo... ya lo revisaré que mañana tengo examen de literatura...
Gracias por valorar mi trabajo ;)

EDITO2: ya he editado el ejercicio para los numeros (<=1). Lo del while ya lo pensaré con tranquilidad ;)
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

Valorar no, lo has hecho (exceptuando el asunto del while, que seguramente caerás pronto en la cuenta) mucho mejor de lo que jamás lo había hecho yo. Y mira que yo sólo adulo cuando es totalmente cierto. Enhorabuena de nuevo :oki:
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por dRoLl3R »

Estoy leyendo el párrafo de literatura y no avanzo por estar pensando en esto.
Profe te has fijado que puse:

Código: Seleccionar todo

if (k==num)
    i = num;
Yo creo que con esto el bucle de while se termina cuando se tiene que terminar sin llegar al numero.
Aunque eso tamien se puede hacer modificando el while de manera que recortas una parte del codigo y no hay que usar (i<num) de esta manera:

Código: Seleccionar todo

while (k!=num)

Esto se me ocurrió mientras escribía el comentario xD
Te referías a eso?
Un saludo
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por m0skit0 »

Sí, no me refiero a eso. A ver, una pista: si un número es primo, compruebas hasta el número mismo...
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por dRoLl3R »

m0skit0 escribió:Sí, no me refiero a eso. A ver, una pista: si un número es primo, compruebas hasta el número mismo...

Así a bote pronto se me ocurre pues comprobar hasta dos números anteriores por esto de ser impares.

EDITO: He estado pensando (mira que es raro xD) y por mas vueltas que le doy creo que es necesario llegar al número mismo porque si no llegas el contador no queda en 1.
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Chacaritas
Enteradillo
Enteradillo
Mensajes: 41
Registrado: 03 Abr 2010, 03:03

Re: [Curso] Introducción a la programación en C (VIII)

Mensaje por Chacaritas »

En la tarea 5 tengo un problema, cuando introduzco el número, y no es igual al número secreto, se termina se programa y no me da as 5 oportunidades . ..
Aqui les dejo el código:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <unistd.h>

int main()
{
   int numsec;
   int numdado;
   int i;
   
   printf("Escribe un número secreto\n");
   scanf("%d", &numsec);
   i = 0;
   while (i < 25)
   {
      printf("\n");
      i++;
   }
   
   printf("Intenta adivinar el número secreto\n");
   scanf("%d", &numdado);
   
   while(numsec != numdado && i < 5)
   {
      i++;
      printf("Intento número %d, intenta con otro:\n", i);
      scanf("%d", &numdado);
   }
   if (numdado == numsec)
   printf("Felicidades, has adivinado . ..!!\n");
   else
   printf("Lo siento, no has superado el reto, vuelve a intentarlo cuando quieras . ..!!\n");
   
   system("read foo");
   return 0;
}


Edito: Ya lo arreglé :oki:

Responder