StandardOil ha scritto:
Quindi il tuo problema è nella seconda funzione, non nella prima
Ok ok
Io non mi metto a provare a scrivere un main apposta
Metti qui il main che usi nelle prove e vediamo
Il main è nascosto, ma si può provare su codeboard al link:
https://codeboard.io/projects/13184
Il codice completo è questo: mi manca solo la succ_prime da sistemare
#include <limits.h>
/* Ritorna 1 se n e' primo, 0 altrimenti. */
unsigned short int is_prime(unsigned short int n) {
int i;
for (i = 2; i <= n; ++i) if (n % i == 0) break;
return i == n ? 1 : 0;
}
/*
* Ritorna l'n-esimo primo, contando a partire da 0.
*
* Se il numero e' troppo grande per essere rappresentato
* con un unsigned short int, ritorna 0.
*/
unsigned short int nth_prime(unsigned short int n) {
unsigned int counter = 0;
unsigned int i;
if (n == 0)
return 2;
for (i = 3; i >= 3; i += 2)
{
if (i > USHRT_MAX) {
return 0;
}
else if (is_prime(i))
{
counter++;
if (counter == n)
return i;
}
}
}
/* Ritorna la successione di numeri primi.
* La prima chiamata ritorna 2, la seconda 3, ecc.
*
* Se il parametro reset e' diverso da 0, allora la
* successione viene resettata e la funzione ritorna 2.
* Diversamente, la funzione ritorna il primo successivo
* a quello ritornato alla chiamata precedente.
*
* Se il primo successivo e' troppo grande per essere
* rappresentato con un unsigned short int, la funzione
* ritorna 0 e la seccessione viene resettata.
*/
unsigned short int succ_prime(int reset) {
unsigned int n = 0, y = 1;
if (reset != 0) {
return 2;
}
while(is_prime(n)) {
return n;
n++;
}
}
/* Ritorna 1 se m e n sono coprimi, 0 altrimenti. */
unsigned short int co_prime(unsigned short int m,
unsigned short int n) {
unsigned int y;
while (n != 0) {
y = m % n;
m = n;
n = y;
}
if (m == 1)
return 1;
else
return 0;
}