Identificar numeros primos en C

Ha pasado un buen tiempo desde que inicie a programar aprendiendo el viejo C, aún tengo en mi archivoteca monton de ejercicios y programillas que hice con C y CPP. El presente se trata de un programa que identifica si un número es primo o compuesto. Obviamente la cosa es sencilla pero me gusto reencontrar este código porque, aunque esta en modo consola, le puse un formato para presentar los resultados.



La cuestión de saber si un número es primo o no se reduce a comprobar si este es divisible entre algun número que no sea 1 y sí mismo y que el modulo de dicha división sea cero. Y ahí me tienen que como se me hizo facil se me ocurrio agregarle la opción de comprobar no sólo un número sino buscar los primos entre un rango dado de numeros.


Aca el código en cuestión:

/* fecha aprox (octubre 2004) compilador turbo c 3*/
#include <conio.h>
#include <stdio.h>
#include <ctype.h> // Para la funcion tolower (convertir a minusculas).
void main(void){  
   char continuar;
   do{ 
     clrscr();
     int num, cntdr, cntdr2, pendiente=2;
     printf("\tReconocer entre numeros primos o compuestos\n");
     printf("(1) Saber si un numero especifico es primo o compuesto\n");
     printf("(2) Saber los primos y compuestos de un rango de numeros");
     do{ 
       gotoxy(30,4), printf("Eliga una opcion: "), clreol();
       scanf("%d",&num); } while (num < 1 || num > 2); // Lee solo 1 o 2
                              /* MODO UNO */
       if (num==1){
         printf("Ingrese el numero a identificar como");
         printf(" primo o compuesto ");
         do{
           gotoxy(56,5), clreol(), scanf("%d",&num);
         }while (num<2);
         for(cntdr=2;cntdr<num;cntdr++) {
           /* Para las sentencias logicas, del anterior for y el siguiente if,
           tuve muchas dificultades el lograr elaborarlas de forma correcta, me
           llevo varios dias hacer que funcionaran sin errores */
           if (num%cntdr==0) {
             printf("\nEl %d es un numero COMPUESTO",num);
             num=0; // Cambio el valor a num para controlar el siguiente if
             break;
           }
         } // Salgo del for, no hay necesidad de seguir comparando
         if (num!=0) printf("\nEl %d es un numero PRIMO",num);
       }
                              /* MODO DOS */
       else { 
         printf("Ingrese el limite del rango en que quiere identificar\n");
         printf("numeros primos y compuestos (numero maximo 999) ");
         /* El limite de 999 es para que a la hora de imprimir se acomoden en
         columnas  de tres digitos maximo. */
         do { 
           gotoxy(50,6), clreol(), scanf("%d",&num);
         } while (num<2||num>999);
         ORDENAR:{
           /* Declaro la funcion ORDENAR por si los numeros no caben en pantalla en cuyo caso la vuelvo a llamar y los muestro por partes.  */
           int comp=0, col = 2, row2 = 11, col2 = 48, row3 = 11, row=8, clmn=1;
           do { 
             gotoxy(1,row), clreol(), ++row; 
           } while (row<25);
           gotoxy(8,9), printf("Numeros Compuestos:\t\t\tNumeros Primos:"); row=24;
           do {
             gotoxy(47,row), printf("%c",186), --row;
           } while (row>7);
           row++;
           do {
             gotoxy(1,row), printf("%c",186), ++row;
           } while (row<25);
           row--;
           do { 
             gotoxy(69,row), printf("%c",186), --row; 
           } while (row>7);
           row++;
           do { 
             gotoxy(clmn,row), printf("%c",205), ++clmn; 
           } while (clmn<=68);
           row=24, clmn=1;
           do { 
             gotoxy(clmn,row), printf("%c",205), ++clmn;
           } while (clmn<=68);
           row=10, clmn=1;
           do { 
             gotoxy(clmn,row), printf("%c",205), ++clmn; 
           } while (clmn<=68);
           gotoxy(1,8), printf("%c",201), gotoxy(69,8), printf("%c",187);
           gotoxy(1,24), printf("%c",200), gotoxy(69,24), printf("%c",188);
           gotoxy(1,10), printf("%c",204), gotoxy(69,10), printf("%c",185);
           gotoxy(47,8), printf("%c",203), gotoxy(47,10), printf("%c",206);
           gotoxy(47,24), printf("%c",202);
           /* Las anteriores 18 lineas solo sirven para hacer arreglos de pantalla que hagan el programa mas vistoso al 
           usuario (Son prescindibles) De hecho las uso ya que no he podido usar la lib graphics.h de c */
           for (cntdr=pendiente;cntdr<=num;cntdr++) {
             for (cntdr2=2;cntdr2<cntdr;cntdr2++) {
               comp=0;
               if (cntdr%cntdr2==0) { 
                 gotoxy(col,row2), printf("%4d",cntdr);
                 /* Estas comparaciones funcionan de igual forma que las anteriores solo que el for anidado hace que se comparen varios numeros. */
                 comp=1, col+=4; // Lo anterior, para arreglos en pantalla.
                 if (col==46) row2++, col=2;
                 break; 
               } 
             }
             if (comp!=1) gotoxy(col2,row3), printf("%4d",cntdr), col2+=4;
             if (col2==68) row3++, col2=48;
             if (row2==24 || row3==24) { 
               pendiente = cntdr, gotoxy(25,25);
               /* Si este if se cumple es que los resultados no cupieron en pantalla regresa a ORDENAR y guarda el valor actual en la variable pendiente. */
               printf("Cualquier tecla para continuar..."), getch();
               goto ORDENAR;
             } 
           } 
         } 
       } // Error, deberia usar estructuras.
       do { 
         gotoxy(25,25), printf("%cDesea salir del programa?(s/n)",168);
         continuar=tolower(getche()); 
       } while(continuar!='s' && continuar!='n'); 
     }while(continuar=='n');
    // Programa repetible cuantas veces quiera el usuario.
}

Comentarios

  1. muy bien... me hubiera servido en otro grado en el que hiba.
    Oey, dberìa mejorar el diseño de su blog... y ademàs, cómo pudo colocar ese cuadro de código???

    ResponderEliminar

Publicar un comentario

Entradas populares