SUCCESSIONE NUMERI PRIMI

di il
15 risposte

SUCCESSIONE NUMERI PRIMI

/* 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 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++;
	}
}

Cosa c'è di sbagliato?

15 Risposte

  • Re: SUCCESSIONE NUMERI PRIMI

    Comincia col dirci cosa vorresti fare e che errori ti da
  • Re: SUCCESSIONE NUMERI PRIMI

    StandardOil ha scritto:


    Comincia col dirci cosa vorresti fare e che errori ti da
    Come c'è scritto nei commenti del codice, il mio intento è quello di creare uno successione di numeri primi, facendo un check tramite la funzione is_prime che ho implementato sopra. Il problema è che in questo modo ritorna sempre 2, quindi vorrei capire come poter fare
  • Re: SUCCESSIONE NUMERI PRIMI

    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
  • Re: SUCCESSIONE NUMERI PRIMI

    	while(is_prime(n)) {
    		return n;
    		n++;
    	}
    e quando arrivi a n++ se c'è un bel return prima?
  • Re: SUCCESSIONE NUMERI PRIMI

    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;
    }
    
    
  • Re: SUCCESSIONE NUMERI PRIMI

    Weierstrass ha scritto:


    	while(is_prime(n)) {
    		return n;
    		n++;
    	}
    e quando arrivi a n++ se c'è un bel return prima?
    Eh, lo so che quella è la parte sbagliata, ma sto provando a trovare un modo
  • Re: SUCCESSIONE NUMERI PRIMI

    Beh, se devi restituire il primo successivo all'ultimo già restituito serve come minimo avere una variabile che si ricorda da una volta con l'altra
  • Re: SUCCESSIONE NUMERI PRIMI

    Il reset serve a fa ricominciare la sequenza dal primo? Cioè, se 0 non resettare, altrimenti resetta?
    Comunque, come ti hanno giò detto, se fai una return, tutto quello che viene dopo non verrà eseguito.
  • Re: SUCCESSIONE NUMERI PRIMI

    SpiritoLibero ha scritto:


    Ma se il valore passato alla funzione succ_prime() è diverso da 0 tu non ci arrivi nemmeno al while:
    
    unsigned short int succ_prime(int reset) {
    
    	unsigned int n = 0, y = 1;
    
    	if (reset != 0) {
    		return 2;   < -- Qui ti fermi già se reset è diverso da 0
    	}
    
    	while(is_prime(n)) {
    		return n;
    		n++;
    	}
    
    }
    
    Se reset è diverso da zero, viene resettata e ritorna 2, mentre se è zero avviene la successione
  • Re: SUCCESSIONE NUMERI PRIMI

    ilMitra ha scritto:


    Se reset è diverso da zero, viene resettata e ritorna 2, mentre se è zero avviene la successione
    Sì, l'ho immaginato dopo aver postato e ho corretto il post, chiedendotene conferma.
  • Re: SUCCESSIONE NUMERI PRIMI

    SpiritoLibero ha scritto:


    ilMitra ha scritto:


    Se reset è diverso da zero, viene resettata e ritorna 2, mentre se è zero avviene la successione
    Sì, l'ho immaginato dopo aver postato e ho corretto il post, chiedendotene conferma.
    Un amico mi ha dato la sua soluzione, però faccio fatica a capire come adattarla al mio tipo di implementazione
  • Re: SUCCESSIONE NUMERI PRIMI

    ilMitra ha scritto:


    Weierstrass ha scritto:


    	while(is_prime(n)) {
    		return n;
    		n++;
    	}
    e quando arrivi a n++ se c'è un bel return prima?
    Eh, lo so che quella è la parte sbagliata, ma sto provando a trovare un modo
    int is_prime(unsigned int n) {
        if(n < 2)
            return 0; 
        int i;       
        for (i = 2; i * i <= n; ++i) 
            if (n % i == 0) 
                return 0;    
        return 1;
    }
    
    
    unsigned int succ_prime(int reset) {
        static unsigned int p = 1;
        if (reset) 
    	p = 2;
        else while(!is_prime(++p));   
        return p;
    }
  • Re: SUCCESSIONE NUMERI PRIMI

    Weierstrass ha scritto:


    ilMitra ha scritto:


    Weierstrass ha scritto:


    	while(is_prime(n)) {
    		return n;
    		n++;
    	}
    e quando arrivi a n++ se c'è un bel return prima?
    Eh, lo so che quella è la parte sbagliata, ma sto provando a trovare un modo
    int is_prime(unsigned int n) {
        if(n < 2)
            return 0; 
        int i;       
        for (i = 2; i * i <= n; ++i) 
            if (n % i == 0) 
                return 0;    
        return 1;
    }
    
    
    unsigned int succ_prime(int reset) {
        static unsigned int p = 1;
        if (reset) 
    	p = 2;
        else while(!is_prime(++p));   
        return p;
    }
    L'unico problema da gestire è il USHRT_MAX, però funziona già più di prima. Grazie!!
  • Re: SUCCESSIONE NUMERI PRIMI

    Cambia unsigned int con unsigned short... vedi che arrivi in overflow abbastanza rapidamente però. Fai prima a farti direttamente la tabella
Devi accedere o registrarti per scrivere nel forum
15 risposte