Rechner kann nicht alle Primzahlen berechnen
-
Hi,
ich beschäftige mich momentan mit der Berechnung von Primzahlen. Laut Aufgabe soll als Input n übergeben werden und als Output die n-te Primzahl.
Ich dachte mir das über das Sieb des Eratosthenes zu lösen. D.h. bie zu einer bestimmten Grenze alle Primzahlen berechnen. Wenn die n-te Primzahl dabei ist, diese ausgeben. Wenn nicht, von neuem beginnen, nur die Grenze höher setzen.
Ich hatte im Thread "Sieb des Eratosthenes" schon meine ersten Ansätze kundgetan und auf Anregung korriert. Nun stürzt mein Microsoft Visual C++ 6.0 ab bzw. gibt Fehlermeldung, sobald er die Primzahlen aus einem Bereich größer 32 berechnen soll. Das ist doch ein Witz!!!!!. Ist das bei euch auch so.
Leider bin ich noch Anfänger. Der Algorithmus ist sicherlich nicht der effiktivste, aber ich wollte von meinen Ideen her ertsmal Schritt für SChritt arbeiten.
Also frage an euch: Ab welchen Bereich kann euer Rechner die ausführbare Datei nicht mehr ausführen? Und wenn sich der Rechner normal verhält. Was bedeutet die Fehlermeldung von MS Visual C++ 6.0 ?
Ihr müßt den Wert der Variablen "size" ändern, um den Bereich zu vergrößern bzw. verkleinern.
mfg
Alex
//es sollen durch eingabe die ersten n Primzahlen ausgegeben werden
//doch zuerst Sieb des Erathostenes#include <iostream>
#include <math.h> //Um wurzel zu ziehen
//#include "header"????using namespace std;
int main ()
{
int size= 50;
int *array= new int[size+1];for (int i= 0; i< size+1 ; i++)
array[i]= 1; //array mit einsen füllen//int boundary= (int) srqt(size); //es reicht nur bis zur Wurzel aus size
int boundary= size/2;for (int j=2; j < boundary; j++)
{
for (int n=2; n< (boundary); n++)
{
array[j*n]= 0; //Vielfache auf Null setzen
}
}int counter= 0;
for ( i= 2; i< size ; i++) //ab 2 sollen die Primzahlen getestet werden
{ // Bis Vektorstelle array[size]
if (array[i] == 1)
counter++;
}for (i= 2; i <size; i++)
{
if(array[i] == 1)
cout << i << endl;
}cout << "Anzahl = " << counter << " " << endl;
return 0;
}
/**
//stopp -- bishierher Sieb des Erathostenes
if( counter< task)
{
size= size*size;
calcultate(size); //nochmal alles von vorn bloss mit größerer Grenze
}
else
{
for(int i= 1; i<= counter; i++)
{
if(array[i] == 1)
{
cout << i << endl;
}}
}
**/
-
Mole schrieb:
Nun stürzt mein Microsoft Visual C++ 6.0 ab bzw. gibt Fehlermeldung, sobald er die Primzahlen aus einem Bereich größer 32 berechnen soll. Das ist doch ein Witz!!!!!
Nein, ein Witz ist das nicht. Vermutlich eher irgendein Fehler in Deinem Programm. Verrate doch mal welche Fehlermeldung Du bekommst.
Bist Du schonmal mit dem Debugger durchgesteppt? (Artikel dazu gibt's neuerdings im Magazin!)
Wo bricht er denn da ab?MfG Jester
-
Er sagt:
Primzahlen.exe hat ein Problem festgestellt und muss beendet werden.
Mit dem Debugger hab ich es noch nicht versucht, weil ich nicht weiß, wie er zu handeln ist. Mit F10 kann man jede einzelne Aneisung anspringen.
Wo ist den das Magazin???
-
Du kannst als Obergrenze nicht einfach die Wurzel durch die halbe Größe ersetzen. Damit ist boundary bei dir 25, und 25 * 25 ist weit über das Ende deines Arrays hinaus.
-
Ja ok. Ich hab es verbessert. Es ist nicht boundary, der den Fehler macht, sondern die Multiplikation auf Vielfache von j. so greif ich durchaus, jenseits aller arraygrenzen hinweg.

...for (int j=2; j < boundary; j++)
{
for (int n=2; n< (boundary); n++)
{
if (nj < size)
{
k= nj;
array[k]= 0; //Vielfache auf Null setzen
}}
}...
Merci
-
Das Magazin findest du unter den anderen Foren in der Forenübersicht, über den FAQs.
-
das wochenende ist gerettet

-
Mole schrieb:
Es ist nicht boundary, der den Fehler macht, sondern die Multiplikation auf Vielfache von j.
Sicher ist es boundary. Dadurch werden j und n zu groß. Dein "Bugfix" besteht nur darin, dass du in der Schleife den Index prüfst - was du gar nicht tun müsstest, wenn du boundary richtig berechnen würdest.