Sieb des Eratosthenes

  • Themenstarter Themenstarter braveheart10
  • Beginndatum Beginndatum
ahh, genau der fehler danke.

Wie sieht das heute mit der kompatibiltät des Programmes auf anderen Systemen/Plattformen/Microcontrollern aus.
Wenn dort die Programmierung eines C-programms verlangt wird schlucken die dann auch den C-code mit der .cpp endung?
 
Hab eben mal Kickerxy123s Programm versucht als .c auszuführen(mit .cpp keine Beanstandung).
Bekomme den o.g. fehler in der for schleife das ist klar - aber er meckert jetzt noch wegem dem array


error C2061: Syntaxfehler: Bezeichner 'pr_feld'
error C2059: Syntaxfehler: ';'
error C3409: Ein leerer Attributblock ist nicht zulässig
error C2143: Syntaxfehler: Es fehlt ']' vor '('
error C2059: Syntaxfehler: 'Konstante'
error C2059: Syntaxfehler: ')'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ')' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2065: 'i': nichtdeklarierter Bezeichner
warning C4552: '<=': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
error C2065: 'i': nichtdeklarierter Bezeichner
error C2059: Syntaxfehler: ')'
error C2143: Syntaxfehler: Es fehlt ';' vor '{'
C2065: 'pr_feld': nichtdeklarierter Bezeichner
error C2065: 'i': nichtdeklarierter Bezeichner
error C2109: Index erfordert ein Array oder einen Zeigertyp
error C2065: 'false': nichtdeklarierter Bezeichner
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ')' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2065: 'i': nichtdeklarierter Bezeichner
warning C4552: '<=': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
error C2065: 'i': nichtdeklarierter Bezeichner
error C2059: Syntaxfehler: ')'
error C2143: Syntaxfehler: Es fehlt ';' vor '{'
error C2065: 'pr_feld': nichtdeklarierter Bezeichner
error C2065: 'i': nichtdeklarierter Bezeichner
error C2109: Index erfordert ein Array oder einen Zeigertyperror C2065: 'i': nichtdeklarierter Bezeichner
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ')' vor 'Typ'
error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'
error C2065: 'j': nichtdeklarierter Bezeichner
error C2065: 'i': nichtdeklarierter Bezeichner
warning C4552: '<=': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
error C2059: Syntaxfehler: ')'
error C2065: 'j': nichtdeklarierter Bezeichner
error C2143: Syntaxfehler: Es fehlt ';' vor '{'
error C2065: 'j': nichtdeklarierter Bezeichner
error C2065: 'i': nichtdeklarierter Bezeichner
error C2065: 'pr_feld': nichtdeklarierter Bezeichner
error C2065: 'j': nichtdeklarierter Bezeichner
error C2065: 'i': nichtdeklarierter Bezeichner
error C2109: Index erfordert ein Array oder einen Zeigertyp
error C2065: 'true': nichtdeklarierter Bezeichner
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
 
naja.. ich weiß grad nicht, ob es alle Fehler ausräumt, aber C kennt standardmäßig nicht den Typen bool.

du könntest
C++:
#ifndef BOOL
typedef int BOOL;
#endif
#ifndef FALSE
#define FALSE 0
#define TRUE 1 
#endif
und dann alle Vorkommnisse von bool/true/false auf BOOL/TRUE/FALSE ändern.

Gruß,
kickerxy
 
ahh, genau der fehler danke.

Wie sieht das heute mit der kompatibiltät des Programmes auf anderen Systemen/Plattformen/Microcontrollern aus.
Wenn dort die Programmierung eines C-programms verlangt wird schlucken die dann auch den C-code mit der .cpp endung?
Wenn du auf Portabilität Wert legst, solltest du C Code auch in .c Dateien speichern (und dann evtl. auf C99 Spracheigenheiten verzichten).

Allerdings kann man bei eigentlich jedem Compiler explizit einstellen in welcher Sprache eine Quelldatei zu lesen ist.

Bei MSVC kannst du auchfür jede Quelldatei in den Eigenschaften festlegen ob die Datei als C oder C++ Code kompiliert werden soll:

alscpp.jpg

Gruß
 
Wenn du dich konsequent an den C89 Sprachstandard hälst, dann bist du maximal portabel, d.h. du kannst mit unter Windows entwickeln und zum Schluss den Releasestand mit deinem MC- C-Compiler fertigstellen. Du wirst dann schon merken (und zwar schon unter Windows), was nicht zum C89 Standard gehört.
Für den gcc unter Windows (=MinGW) wäre dann z.B. die Option -ansi empfehlenswert.
Für MSVC sollte die Datei mit .c enden, du solltest keine "_irgendwas" Funktionen benutzen und keine NICHT-C89-Standard Headers benutzen (z.B. nicht conio.h,windows.h usw.) um C89 konform zu bleiben.
 
noch eine letzte frage.

ich möchte mit diesen ersten 500 primzahlen die ich ermittelt habe nun weiter rechnen.
wie kann ich nun auf diese zugreifen?

z.B.
er soll die erste Primzahl (p=2) nehmen rechnen und ausgeben x= (2^p)-1
danach soll er auf die nächste Primzahl (p=3) zugreifen x errechnen und ausgeben
und so weiter bis zur 500ten Primzahl.
 
Entweder musst du die Primzahlen in einem Array zwischenspeichern, oder auch gleich da ausgeben, wo jetzt die Primzahlen ausgegeben werden.

Die Formel, die du angegeben hast, wäre in C-Schreibweise
(1<<p) -1

Aber bist du dir sicher, dass du die Aufgabenstellung richtig verstanden hast?
Du wirst so nämlich mit den normalen Variablen nicht auskommen.

Ein (unsigned) int mit 32bit kommt bis zu Werten von 4294967295 = 2^32 -1
Deine Berechnung würde also nur für die ersten 11 Primzahlen (31 ist die elfte) funktionieren, weil für die höheren das Ergebnis nicht mehr in die Variablen passen würde.
Deine Primzahlen gehen aber bs ca. 3500 statt 31 (!)

Für die höheren Zahlen gibts verschiedene Bibliotheken, die das können...aber hast du nicht doch was falsch verstanden?
 
hätte da jetzt die <math.h> eingebunden
und irgendwas mit double pow versucht.

kannst du mir sagen die du das meinst das alles nochmal in ein array zu speicher?
weil wenn ich die ausgabe in die andere schleife einbaue gibt er mir ja erst die primzahl und dann das x aus - und das 500 mal
ich möchte aber erst die 500 primzahlen und dann die x berechnung.

das ist die aufgabenstellung:
Schreiben Sie ein C++-Programm, das ermittelt, für welche Zahlen z = (2 p ) -1 ( 2 hoch p ) -1 Primzahlen sind, wenn p selbst eine Primzahl ist .
Beispiel Für p = 2 ist 2 2 -1 = 3 eine Primzahl oder für p= 3 ist 2 3 -1 = 7 eine Primzahl,
aber x =2 11 -1 = 2047 ist keine Primzahl

also x soll dann auch nur ausgegeben wenn basis^exponent auch wieder eine Primzahl ist. das werden dann natürlich keine 500 zahlen.
 
Wie ich schon geschrieben habe, für diese Aufgabe wirst du eine externe Bibliothek brauchen (oder sowas wie eine Bigint-Klasse selber programmieren).

Allerdings lässt mich das
(2 p ) -1 ( 2 hoch p ) -1
wieder zweifeln.
Beim ersten verstehe ich 2 mal p -1

Steht das
Beispiel Für p = 2 ist 2 2 -1 = 3 eine Primzahl oder für p= 3 ist 2 3 -1 = 7 eine Primzahl,
aber x =2 11 -1 = 2047 ist keine Primzahl
auch so in der Aufgabenstellung?

edit: Deine höchste Primzahl ist 3571
Ein unsigned int kommt bis zu Zahlenwerten von 4294967295, also rund 4 Milliarden

(2^3571)-1 ist aber:
=9508554850410568696839441827625561356733871556707288357054599728032847914202118
68253794287764581576835988353348075927072662291473978400562295505879444359495815
16891535802491777606950878848376539992864893085269038802289721051003529989776963
81772651348690390313002051792853601926748364871850807065229722957632751249466545
74508172244855898882611618535289258974166724529784929229466287188174256748403186
37414191477340359612838440442622805733700456248083679235658852029933524812551569
24794583112283670387771177435431877124228143180950073514876882911924227283045390
15783782410193782069929720125837419484637577979561240882051615743077466988530530
24480227717212334884070271702107370083983879372748486720365581512799549579775802
68016257307717375849004921923545530120821924142119814767838050858463640719213346
58525024781603424791720970448038112024728162319728252869071124853986516943691952
77141092882154164498060660372475330937432870552522471946141915472602134254625182
79154895383952874385343615367502943824092760416444275100156469060590485948432434
675697069322678553853125685671886847

Kommt dir das nicht irgendwie seltsam vor?
 
Zuletzt bearbeitet:
ja hat der Prof. beschissen geschrieben.

nach dem z = (2^p ) -1 kommt wohl ein punkt und dann beginnt eine neue zeile mit ( 2 hoch p ) -1 Primzahlen sind, wenn p selbst eine Primzahl ist .

Hier hat einer aus meinem semester die aufgabe bereits gelöst - aber ich will diesen algorythmus nicht verwenden.
http://www.c-plusplus.de/forum/277033

er macht das ganze ja mit der modulo berechnung gut in dem programm sind nur die ersten 500 verlangt aber wenns dann dochmal grösser sein soll gehts mit dem sieb des eratosthenes oder atkin schneller.
http://geisswinkler.de/stefan/wordpress/wp-content/uploads/2008/02/diagramm.jpg
 
Zurück