[C] programma che calcola la somma di N numeri primi
Ragazzi ho scritto un codice che dovrebbe calcolare la somma dei primi N numeri primi, tuttavia dopo svariate modifiche continua a non dare il risultato richiesto. Posto il codice (non so come scriverlo come sezione separata dal testo con colori, indentature ecc :S) sperando che qualcuno di voi possa indicarmi l'errore...
ps. La funzione prendi intero l'ho scritta con l'intenzione che il valore ritornato "ris" sia 1 se il numero è primo e 0 se il numero è non primo..mi è sorto il dubbio che non funzioni come vorrei e che il problema sia proprio li... grazie in anticipo ^^
#include <stdlib.h> #include <stdio.h> void spiegazione(); int prendiN (int min); int prendintero(int numero); int main(){ void spiegazione(); int N=prendiN(0); int somma=0; int m=0, n=0, i=0; do{ m++; for (i=0; i<N; i++){ int primo=prendintero(i); if(i==1); n++; somma+=i; } } while (n<N); printf("La somma dei primi %d numeri primi è %d\n", N, somma); } void spiegazione(){ printf("Questo programma fa cose\n"); } int prendiN(int min){ int N; do{ printf("Inserisci numero maggiore di %d\n", min); scanf("%d", &N); if (N<min) printf("Errore!\n"); } while(N<min); return N; } int prendintero(int numero){ double ris; int i=0; for (i=2; i<numero; i++){ ris=numero%i; if (ris!=0){ ris=1; } else if (ris=0){ ris=0; } } return ris; }
ps. La funzione prendi intero l'ho scritta con l'intenzione che il valore ritornato "ris" sia 1 se il numero è primo e 0 se il numero è non primo..mi è sorto il dubbio che non funzioni come vorrei e che il problema sia proprio li... grazie in anticipo ^^
Risposte
Il numero passato come argomento a prendinumero è maggiore o uguale a zero, ma la funzione restituisce un valore potenzialmente casuale quando numero è minore di tre (quando il ciclo interno non viene eseguito insomma). Perché poi stai usando una variabile double per ris? Può essere uguale solo a 0 e 1. La variabile ris è inoltre riscritta ad ogni iterazione per cui, siccome numero%(numero-1) sarà sempre diverso da zero per valori oltre il 3, il risultato sarà sempre uno.
EDIT: Ho appena notato che hai anche usato = al posto di == in una delle condizioni. Ma non cambia nulla perché non ci sono ulteriori possibilità (la condizione è inutile) e in effetti quella era l'operazione che volevi comunque fare in quel caso.
EDIT: Ho appena notato che hai anche usato = al posto di == in una delle condizioni. Ma non cambia nulla perché non ci sono ulteriori possibilità (la condizione è inutile) e in effetti quella era l'operazione che volevi comunque fare in quel caso.
"apatriarca":
Il numero passato come argomento a prendinumero è maggiore o uguale a zero, ma la funzione restituisce un valore potenzialmente casuale quando numero è minore di tre (quando il ciclo interno non viene eseguito insomma). Perché poi stai usando una variabile double per ris? Può essere uguale solo a 0 e 1. La variabile ris è inoltre riscritta ad ogni iterazione per cui, siccome numero%(numero-1) sarà sempre diverso da zero per valori oltre il 3, il risultato sarà sempre uno.
Ti ringrazio, ho corretto gli errori minori che mi hai segnalato. Per il resto... ho capito perchè può ritornare un valore casuale. Quello che devo fare io per determinare se m è un numero primo è "controllare se il resto della sua divisione con qualunque numero compreso tra 2 e m-1 è diverso da 0".. l'intenzione era quella di far ritornare a ris il valore 0 se veniva trovato un qualsiasi numero che nella divisione con m ritornava 0, perchè cioè escludeva il fatto che potesse essere primo. L'ho impostata male... sapresti spiegarmi come fare?
Devi semplicemente uscire dal ciclo dopo che hai trovato almeno un divisore del numero e rimanerci dentro finché non lo trovi o hai raggiunto il numero.
Apatriarca, il mio problema è che ero convinta di aver fatto proprio questo. Dato che così non è, potresti mostrarmi un esempio di codice sorgente? :S
Per uscire dal ciclo devi usare o break o return.
int prendintero(int numero){ int ris, i=0; for (i=2; i<numero; i++){ do{ ris=numero%i; }while(ris==0||ris==numero); if (ris!=0){ ris=1; } else if (ris==0){ ris=0; } } return ris; }
Ho scritto così provando a seguire il tuo consiglio, con il return alla fine della funzione, il programma però continua a non funzionare...
Non conoscendo il C non posso aiutarti a trovare l'errore, ma ho provato a fare il programma in C++; te lo posto, magari ti può essere d'aiuto sul piano logico.
#include <iostream> #include <cstdint> using namespace std; int main() { int64_t n, somma = 0, x = 2, div; bool primo; cout << "N = "; cin >> n; while(n != 0) { primo = 1; div = 2; while(x >= div * div) { if(x % div == 0) { primo = 0; break; } div = div + 1 + div % 2; } if(primo == 1) { somma = somma + x; n--; } x = x + 1 + x % 2; } cout << "SOMMA = " << somma; }
Ti ringrazio, e scusa per il ritardo! In effetti mi è tornato molto utile e ho già parzialmente risolto il problema
