Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Criterio di Eratostene
Forum - C/C++ - Criterio di Eratostene

Avatar
BionicGod (Normal User)
Rookie


Messaggi: 33
Iscritto: 16/06/2011

Segnala al moderatore
Postato alle 12:03
Lunedì, 05/09/2011
Questo topic è stato chiuso dal moderatore

Salve a tutti, avevo pensato di scrivere in C++ il criterio di Eratostene che avevo precedentemente fatto, e con successo, in C# 3.5.
Però ho un problema, viene restituito "Errore di virgola mobile" appena avvio il programma. Non sono ancora riuscito a determinare la riga che ha generato l'eccezione. Qualcuno potrebbe aiutarmi? Il codice non sarà scritto perfettamente, ma, per il momento, mi interessa individuare l'errore.
Né Code::Blocks né Geany mi hanno aiutato, infatti entrambi utilizzano lo stesso compilatore (gcc). Vi prego aiutatemi!

Il codice è:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. bool Calcola(int Numero)
  7. {
  8.         bool Primo = true;
  9.         int numeriPrimi[Numero];
  10.         bool tempPrimo = true;
  11.         int Pos = 0;
  12.         for (int x = 2; x <= ceil(sqrt(Numero)); x++)
  13.         {
  14.                 if (x > sqrt(Numero))
  15.                 {
  16.                         for (int n = 2; n <= sqrt(x); n++)
  17.                         {
  18.                                 tempPrimo = true;
  19.                                 if (x % n == 0)
  20.                                 {
  21.                                         tempPrimo = false;
  22.                                         break;
  23.                                 }
  24.                                 if (tempPrimo)
  25.                                         numeriPrimi[Pos++] = x;
  26.                         }
  27.                 }
  28.                 else
  29.                         numeriPrimi[Pos++] = x;
  30.                 }
  31.                 for (int x = 0; x <= Pos; x++)
  32.                         if (Numero % numeriPrimi[x] == 0)
  33.                                 Primo = false;
  34.                 return Primo;
  35. }
  36.  
  37. int main()
  38. {
  39.         for (int x = 0; x < 100; x++)
  40.         {
  41.             if (Calcola(x))
  42.                         cout << x << " è un numero primo";
  43.         }
  44.         return (0);
  45. }


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 13:39
Lunedì, 05/09/2011
Il tuo codice non ha senso. Praticamente iteri da 2 a ceil(sqrt(Numero)), e tutte le volte controlli che il contatore sia minore di sqrt(Numero). E' assurdo: tanto valeva scrivere nel corpo del for direttamente il codice di else. E perché controlli se x è primo quando x > sqrt(Numero) ? Stai creando un crivello, non ti serve controllare la primalità di un numero. Inoltre è tutto sbagliato, poiché se Numero è ad esempio 48, nell'array numeriPrimi avrai 1, 2, 3, 4, 5, 6, in cui 1, 4 e 6 sono chiaramente non primi.

Infine, nel caso particolare di Numero = 1, che viene computato subito nel main, hai che x = 2 > sqrt(1) (dato che ceil(1) = 1), perciò l'array numeriPrimi ha un solo elemento non inizializzato: non so come si comporti C++, ma sembra proprio che in quel caso il valore presente nell'array sia 0. In questo modo, quando nell'ultimo for esegui una divisione per computare il modulo stai di fatto dividendo per zero, il che causa un errore di virgola mobile.

http://pastebin.com/kzwtGAsR questo è il mio codice in C#, probabilmente ho tradotto male. - BionicGod - 05/09/11 14:27
Ho risolto il problema. Potete chiudere. - BionicGod - 05/09/11 16:35
Anche in C# è sbagliato. Non so perché, ma supponi che tutti i numeri da 2 a sqrt(N) siano primi... - Il Totem - 06/09/11 10:49
PM