Sieb des Eratosthenes

B

braveheart10

Hi,
so wie mein code unten steht gibt er mir alle Primzahlen bis 5000 aus.
Ich möchte aber das er mir nur die ersten 500 Primzahlen ausgibt - hab schon alles probiert da ne zählschleife einzubaun aber ich bekomms nicht hin.
Hoffe hier kann jemand helfen.
Mfg

C++:
#include <stdio.h>
#include <stdlib.h>


int pr_feld[5000];  //Array der zu überprüfenden Zahlen
int i;              //Zählvariable
int j;              //Funktionsinterner Zähler
 
main(void)
{  
	//Sieb des Eratosthenes
	for(i=2; i <= (sizeof(pr_feld)/sizeof(int)); i++) 
	{
		if(!pr_feld[i])
		{
			printf("%4d\t",i);
			for(j = 1;(j*i) <= (sizeof(pr_feld)/sizeof(int));++j) 
			{
				pr_feld[(j*i)] = 1;
			}
		}
	}
	system("Pause"); 
}
 
C++:
#include <stdio.h>
#include <stdlib.h>
 
 
int pr_feld[5000];  //Array der zu überprüfenden Zahlen
int i;              //Zählvariable
int j;              //Funktionsinterner Zähler
 
int main(void)
{  
	for(i=0;i<5000;i++)pr_feld[i]=0;
	int iii=0;
    //Sieb des Eratosthenes
    for(i=2; i <= 5000; i++) 
    {
        if(!pr_feld[i])
        {
            iii++;
            if(iii>500)break;
            printf("%4d\t",i);
            for(j = 1;(j*i) <= (sizeof(pr_feld)/sizeof(int));++j) 
            {
                pr_feld[(j*i)] = 1;
            }
        }
    }
    system("Pause");
	return 0;
}

Nur die drei Zeilen mit iii.
Wenn man ++ und das if zusammenfasst, nur zwei.

Und mach doch nicht solche seltsamen sizeof-Sachen
 
Zuletzt bearbeitet:
Hallo,
sizeof ist sehr unschön (bei mir lief das Programm z.B. nur bis 1000 (!)).

ich würde dir folgendes vorschlagen:
C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define max_prim 500
 
bool pr_feld[(max_prim+1)];  //Array der zu überprüfenden Zahlen

int main(void)
{  
for(int i = 0; i <= max_prim; i++)
{
   pr_feld[i] = false;
}
    //Sieb des Eratosthenes
    for(int i=2; i <= max_prim; i++) 
    {
        if(!pr_feld[i])
        {
            printf("%4d\t",i);
            for(int j = 1;(j*i) <= max_prim;++j) 
            {
               if((j*i) <= max_prim)   
                  pr_feld[(j*i)] = true;
            }
        }
    }
    printf("beliebige Taste zum Beenden druecken...");
    getch();
return EXIT_SUCCESS; 
}

noch ein paar Anmerkungen: getch() ist besser als system(), da es nicht manipuliert werden kann und dein Array pr_feld musst du vorher initialisieren (mit false auffüllen). Wenn du das nicht tust, kommt es in (zwar ganz seltenden) Fällen vor, dass ein Element in dem Array zufällig ein true enthält und somit deine Berechnung ein Fehler aufweist!


Gruß
kickerxy
 
Zuletzt bearbeitet:
Und mach doch nicht solche seltsamen sizeof-Sachen
Wieso? Diese „seltsamen sizeof-Sachen“ sind in jedem Fall besser als magische Konstanten, die man im Quelltext verstreut.

sizeof ist sehr unschön (bei mir lief das Programm z.B. nur bis 1000 (!)).
Dann ist dein Compiler kaputt.

ich würde dir folgendes vorschlagen: […]
Damit werden allerdings nicht die ersten 500 Primzahlen ausgegeben, sondern alle Primzahlen bis 501.

Grüße,
Matthias
 
Mag sein, dass es an meinem älteren Dev-Cpp->Mingw Compiler liegt...
mir ist grade nicht ganz klar, warum bei mir bis 501 gegangen werden sollte..?

Ich finde nach wie vor meine #define -Variante schöner als sizeof()- Konstrukte, zumal so oder so an einer Stelle 500 stehen muss. Aber gut, das ist sicher Ansichtssache.


#edit bzgl. 501/500: meinst du wegen "++j" ? Ist mir grade aufgefallen... das verwende ich eigentlich auch nicht, nur da der Threadstarter dieses so hatte... dann sollte man das in "j++" ändern. Kann mich aber da auch grade nicht mehr reindenken, da ich ziemlich müde bin und jetzt los muss.

#edit2: Nein, meine Schleifen waren trotzdem korrekt... Wenn man
C++:
if(!pr_feld[i]
auskommentiert, dann zählt er brav von 2 bis 500.

Gruß und einen schönen Abend
kickerxy
 
Zuletzt bearbeitet:
mir ist grade nicht ganz klar, warum bei mir bis 501 gegangen werden sollte..?
Mein Fehler, das müsste natürlich 500 heißen. Der eigentliche Kritikpunkt bleibt trotzdem: gefragt war nach den ersten 500 Primzahlen, nicht nach den Primzahlen, die kleiner oder gleich 500 sind. Das ist natürlich ein Unterschied. Die ersten 10 Primzahlen sind beispielsweise 2, 3, 5, 7, 11, 13, 17, 19, 23 und 29, während die Primzahlen kleiner gleich 10 nur 2, 3, 5 und 7 sind.

Grüße,
Matthias
 
Hatte jetzt nur sheel seine schleife in mein programm eingebaut und dann kickerxy123s code gar nicht mehr compilier aber die anderen haben recht ich suche die ersten 500 Primzahlen (2 bis 3571).

noch ne frage:

liegt das an meinem IDE oder warum bekomm ich beim compilieren nen fehler wenn ich die typdefinition der zählvariable z.B. i inerhalb der forschleife mache? (funktioniert bei mir nur wenn ich sie erst auserhalb deklariere.
benutze Visual C++ 2008 Express Edition.

geht:
int i;
for(i=2;...

geht nicht:
for(int i=2;...
 
Hi.
noch ne frage:

liegt das an meinem IDE oder warum bekomm ich beim compilieren nen fehler wenn ich die typdefinition der zählvariable z.B. i inerhalb der forschleife mache? (funktioniert bei mir nur wenn ich sie erst auserhalb deklariere.
benutze Visual C++ 2008 Express Edition.

geht:
int i;
for(i=2;...

geht nicht:
for(int i=2;...
Das ist der Unterschied zwischen C (vor 1999) und C++.

Du kompilierst deinen Code offenbar als C Code. Der Visual C Compiler unterstützt den "neuen" C Standard von 1999 aber nicht und demnach darfst du die Variablen nicht innerhalb der for Anweisung definieren.

Mit dem MSVC ist es eigentlich sinnvoller den C Compiler gar nicht mehr zu benutzen und stattdessen den C++ Compiler als einen verbesserten C Compiler einzusetzen.

Benenne einfach deine Dateien nicht mit .c sondern mit .cpp als Endung.

Gruß
 
Zurück