+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 2 su 2

Discussione: numeri primi troncabili a destra

  1. #1
    pir
    pir non è in linea Novello
    Post
    12

    numeri primi troncabili a destra

    Buon giorno a tutti
    ho da risolvere un tema d'esame nel quale mi è richiesto di creare un programma in C che attivato con 3 parametri da linea di comando
    1. nome del file
    2. numero
    3. numero1
    legga un file che contiene una serie di numeri interi e, selezionati quelli inclusi fra i due inseriti da linea di comando, stabilisca se siano "primi troncabili a destra" cioè numeri primi che continuano ad essere primi se troncati di una cifra fino all'ultima possibile. Esempio: 317 . lui è primo, 31 pure e 3 pure. Dopodichè stampi in un file dal nome "numeri_ filtrati" quelli trovati.

    Il mio approccio è stato il seguente:
    leggo un numero, se non è incluso nei due estremi immessi da linea di comando esco e leggo un'altro numero, altrimenti verifico se è primo. Se non lo è esco e ne leggo un altro. Se lo è , lo divido per 10( lavorando con gli interi è come troncare l'ultima cifra no?) e ripeto fino a che il numero non diventa 0 (nel caso di primo ,per esempio, arrivati a 3 otterrei 0.3 che con gli int è 0). Se l'opportuno flag è rimasto invariato stampo il numero.
    Adesso , oltre al fatto che il programma non va per ragioni a me ignote, c'è (immagino) un altro problema che permarrebbe anche al di là del mio algoritmo: non sapendo quante righe ha il file (il testo dice espressamente di non fare alcuna assunzione arbitraria in merito) non posso dimensionare una struttura dati per contenere gli eventuali numeri trovati quindi nel codice che segue ho aperto il file di output in modalità scrittura a monte per riempirlo numero a numero, solo che , se nessun numero rispetta i parametri il file non deve essere aperto...a me piacerebbe creare un vettore nel quale accumulare i numeri e nel caso non sia vuoto aprire il file e stampare ma non so come potrei fare .
    Chiaramente non sono permesse allocazioni dinamiche della memoria che non fanno parte del corso.
    In ultimo la mia idea per "congelare" il numero letto qualora superi il controllo di aderenza ai parametri era assegnarlo ad una seconda variabile , dato che poi procederò a dividerlo fino a renderlo 0. Questa cosa tuttavia non mi convince del tutto.
    Ecco il codice e grazie in anticipo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char* argv[])
    {   FILE* fp;
        FILE* fout; 
        int estr1, estr2, i, n, N, primo=0; 
        
        //controlli di correttezza input
        if(argc!=4){
           printf("errore: parametri insufficienti");
           return -1;
    	}
       
        fp=fopen(argv[1], "r");
        if(fp==NULL){
        	printf("errore: file non aperto correttamente");
        	return -1;
    	}
    	fout=fopen("numeri_filtrati.txt", "w");
    	  if(fout==NULL){
    	  	printf("errore: file non aperto correttamente");
    	  	return -1;
    	  } 
    	//lettura input
    	sscanf(argv[2], "%d", &estr1 );
    	sscanf(argv[3], "%d", &estr2);
        //lettura file
        while(fscanf(fp, "%d", &n)!=EOF){
        	//controllo estremi
    		if(n>=estr1 && n<=estr2){
    			N=n; //n lo andrò a modificare per vedere se è primo tronc
    			primo=1;
        		while(n!=0 && primo==1){
        			
    				for(i=2;n%i!=0;i++); //controllo primo
        		
    				if(i==n)  //se il controllo va a buon fine, tolgo l'ultima cifra e continuo
        			   n/=10;  
    			    else
    			    primo=0; //esco e leggo il prossimo numero dal file
    		} //chiuso while 
    		} //chiuso if
    		
    		if(primo==1)
    			fprintf(fout, "%d\n", N); //stampa nel file nuovo; 
    	
    	} //chiuso while lettura
    	
    	//chiusura file
        fclose(fp);
        fclose(fout);
        
        system("PAUSE");
        return 0;
    }

  2. #2
    pir
    pir non è in linea Novello
    Post
    12
    Risolto . il codice è leggermente diverso ma nella sostanza non è cambiato granché. Il problema era il mio check di numeri primi che non funzionava con numeri che contengono 1 come prima cifra. Mi resta solo da capire se si può evitare di aprire il file a monte e aprirlo solo se serve

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi