Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
05/09/11 10:03
BionicGod
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 è:
#include <iostream>
#include <cmath>

using namespace std;

bool Calcola(int Numero)
{
	bool Primo = true;
	int numeriPrimi[Numero];
	bool tempPrimo = true;
	int Pos = 0;
	for (int x = 2; x <= ceil(sqrt(Numero)); x++)
	{
		if (x > sqrt(Numero))
		{
			for (int n = 2; n <= sqrt(x); n++)
			{
				tempPrimo = true;
				if (x % n == 0)
				{
					tempPrimo = false;
					break;
				}
				if (tempPrimo)
					numeriPrimi[Pos++] = x;
			}
		}
		else
			numeriPrimi[Pos++] = x;
		}
		for (int x = 0; x <= Pos; x++)
			if (Numero % numeriPrimi[x] == 0)
				Primo = false;
		return Primo;
}

int main()
{
	for (int x = 0; x < 100; x++)
	{
	    if (Calcola(x))
			cout << x << " è un numero primo";
	}
	return (0);
}
aaa
05/09/11 11:39
Il Totem
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.
aaa