/******************************************************************** Programa que calcula tantos números primos como uno quiera, partiendo de la base que son primos 2,3,5. Programado por Carles Pina i Estany (abril de 1998). El programa genera un fichero temporal con todos los primos con retornos de carro y otro separados con guiones. En este último pone la hora que empieza, la que termina y cuantos números primos terminan en 1,3,7 y 9. Por cualquier problema/duda ponerse en contacto con el autor: cpina@nexo.es El autor no se responsabiliza de posibles pérdidas ni garantiza en absoluto el correcto funcionamiento del programa. NOTA: aunque sea mucho más lento; se ha obtado por poner unos números necesarios por el programa en el HDD como fichero temporal (recomiendo borrarlo al terminar) en lugar de hacerlo en RAM para así evitar quedarse corto de memoria (ni compilando en HUGE podia meter un array de suficiente tamaño). Es por este motivo que recomiendo defragmentar el HDD antes de utilizar el programa (si es con números muy grandes) y ejecutarlo en el HDD más rápido que tengas (SCSI, etc.) NOTA2: la interface grafica es pésima. ¿Por qué? 1) si empiezo a meter estadísticas, que diga el tiempo que falta, etc. cuando está calculando queda monísimo pero va mucho más lento. 2) se supone que es para programadores y amantes de la matemática, y lo que quieren ver es como, no que quede todo bonito y poca cosa ***********************************************************************/ #include #include #include #include main () { struct tm *punt; /*define la estructura para la hora y data*/ long int prims,conta; /*para calcular y contar los números*/ long int un,tres,set,nou; /*variables para contar si terminan en 1,3...*/ int es; /*es:flag || i:contador*/ long int i; char cad[33]; /*paso un long int a cadena para saber su ultima cifra*/ char cadena[128]; /*necesario al coger del fichero temporal*/ char ultim; /*almacenar la ultima cifra*/ ldiv_t n; /*defino estructura de residuo y cociente, para saber si la división da exacta o no*/ FILE *fitxer; /*puntero al fichero principal*/ FILE *temp; /*puntero al fichero temporal*/ time_t lt; /*defino estructura de hora, dia, año...*/ lt=time(NULL); /*relativo a la hora*/ punt=localtime (<); /*relativo a hora...*/ un=0; /*pongo a 0 las variables que contaran los numeros*/ tres=0; set=0; nou=0; conta=0; clrscr (); /*no comment :-D*/ gotoxy (9,9); printf ("Se calcularán los números primos"); fitxer=fopen ("primers.txt","w"); /*abro los ficheros w->escritura //w+->escritura/lectura*/ temp=fopen ("temp.tmp","w+"); fprintf (fitxer,(asctime(punt))); /*pongo al fichero principal la hora*/ fprintf (fitxer,"2-3-5-"); /*y los numeros primos base*/ fprintf (temp,"2\n3\n5\n"); /*igual al fichero temporal*/ rewind (temp); /*hago que la posición del fichero tempo- ral sea el inicio*/ i=2; /*tendria que ser 3 (tres numeros que damos) pero es 2 pq más abajo ya le sumo yo uno [creo que es esto]*/ for (prims=7;prims<=2000000;prims++) /*bucle principal. Puedes sustituir el 2000000 por el número que quieras de numeros primos*/ { es=1; /*salimos de que todo numero es primo y lo desmentimos después*/ i=conta+4; /*el 4 pq son los que decimos arriba. Cuenta los numeros primos calculados hasta ahora*/ ltoa (prims,cad,10); /*convierto el long int prims a cadena (cad)*/ ultim=cad[strlen(cad)-1]; /*pongo a ultim el ultimo carácter de cad*/ rewind (temp); /*que vaya al principio del fichero temporal*/ if ((ultim=='1') || (ultim=='3') || (ultim=='7') || (ultim=='9')) /*los números primos solo pueden terminar en 1,3,7 y 9, pues sólo calculamos los que terminan en esto, los otros ya lo sabemos que no lo son*/ { while (i>0) /*i son los números primos que tenemos más los que damos*/ { fgets (cadena,126,temp); /*cojo la primera línea de temp, que es el primer primo*/ n=ldiv(prims,atol (cadena)); /*y miro si da exacto*/ if (n.rem==0) { es=0; /*si da exacto es=0 -> no es primo*/ break; /*sale del bucle (while)*/ } i --; /*sigue contando hacia abajo hasta 0*/ } } else { es=0; /*viene directo aquí si no termina en 1,3,7,9; por tanto ya sabemos que NO es primo*/ } if (es==1) /*en caso que es=1 -> es primo*/ { conta++; /*añadimos uno al contador conta (saber cuantos primos tenemos...*/ gotoxy (10,10); printf ("%ld",prims); /*escribe el primo en pantalla*/ fprintf (fitxer,"%ld-",prims); /*idem en el fichero*/ fprintf (temp,"%ld\n",prims); /*y en el temporal*/ if (ultim=='3') tres++; if (ultim=='1') un++; if (ultim=='7') set++; if (ultim=='9') nou++; /*contador de como termina. Variable ultim se calcula más arriba*/ } } /*pasa por aquí cuando ya está todo el proceso*/ lt=time(NULL); punt=localtime (<); /*cosas de las horas (volver a calcular punt que ser  utilizado para ponerlo en el fichero más abajo*/ printf ("\nNúmeros primos calculados %ld",conta+3); /*enseña los numeros primos calculados*/ fprintf (fitxer,"\n\nNúmeros primos calculados %ld",conta+3); /*idem en el fichero*/ fprintf (fitxer,"\nNúmeros primos acabados en 1:%ld",un); fprintf (fitxer,"\nNúmeros primos acabados en 3: %ld",tres); fprintf (fitxer,"\nNúmeros primos acabados en 7: %ld",set); fprintf (fitxer,"\nNúmeros primos acabados en 9: %ld",nou); /*pone las estadísticas de como terminan*/ fprintf (fitxer,"\nCarles Pina i Estany\n"); fprintf (fitxer,(asctime(punt))); /*inserta hora*/ fclose (fitxer); /*cierra fitxer*/ }