Ti ringrazio del supporto, grazie davvero.
Ho deciso di guardare la soluzione, è da stamattina le 7 che sto su questi programmi e vorrei andare a letto...
Il seguente è la soluzione del professore. L'ho letta e l'ho capita. Unico problema è che non funziona xD
Se li chiedo di stamparmi a video il milionesimo numero, fa qualcos'altro, ed è lo stesso con altri numeri. Riesci ad individuare l'errore??
codice:
#include <stdio.h>
int prime(long long n) { //Ritorna vero se e solo se n è un numero primo
long long k = 2;
while (k * k < n && (n % k) != 0) k++;
return (k >= n || (n % k) != 0);
}
void writeprimetable(char *fname, int np) {
FILE *f = fopen(fname, "wb");
if (f == NULL) return;
long n = 2, count = 0;
while (count < np) {
if (prime(n)) {
fwrite(&n, sizeof(long), 1, f);
count++;
}
n++;
}
fclose(f);
}
#define NUM_PRIMES 1000000L
int main(int argc, char *argv[]) {
if (argc != 2) return 0;
FILE *f = fopen(argv[1], "rb"); //Apre il file con la tabella
if (f == NULL) { //Se il file non esiste lo crea
printf("Elaborazione tabella...\n");
writeprimetable(argv[1], NUM_PRIMES);
printf("OK\n");
f = fopen(argv[1], "rb");
}
if (f == NULL) return 0;
while (1) {
long k, p;
printf("Numero d'ordine del numero primo (1 - %ld), 0 per terminare: ",
NUM_PRIMES);
scanf("%ld", &k);
if (k < 1 || k > NUM_PRIMES) break;
fseek(f, (k - 1)*sizeof(long), SEEK_SET);
fread(&p, sizeof(long), 1, f);
printf("Il %ld-esimo numero primo e' %ld\n", k, p);
}
return 0;
}