URL: https://www.overclockers.at/coding-stuff/c_primzahlen_58535/page_2 - zur Vollversion wechseln!
Man gebe in Google den Begriff "Sieb des Eratosthenes" ein, verknüpft mit dem Begriff "c++" und voila, schon gibts sourcen über sourcen *gg*
MFG
Ecraft
aber er scheint ja noch gar nicht zu wissen, ob es das "Sieb des Eratosthenes" sein soll, oder nicht. das forum in dem lauter hellseher sitzen muß noch gefunden werden.
Code:#include <stdio.h> void main(void) { char primzahl[100]; int zahlen[100]; int i1,i2,ist_primzahl; char W=1,F=0; for(i1=0;i1<=99;i1++) { zahlen[i1] = i1; ist_primzahl = W; if (i1==1) ist_primzahl=F; for(i2=2;i2<i1;i2++) { if ((i1/i2)*i2==i1) ist_primzahl=F; } if (ist_primzahl==W) primzahl[i1] = "*"; else primzahl[i1] = " "; } }
folgendes programm hab ich auch schon erfolgreich getestet (es benutzt eine verbesserte variante vom BobbyPI-algorithmus von vorhin)
Code:#include <stdlib.h> #include <stdio.h> #include <math.h> #define n 100 int main() { int e[n]={1,2}; int ei=2,i1,i2,s; for (i1=3;i1<n;i1++) { s=sqrt(i1); for (i2=2;i2<=s&&i1%i2;i2++); if (i2>s) e[ei++]=i1; } for (i1=1,i2=0;i2<ei && i1<n;i1++) if (e[i2]>i1) printf("* "); else {printf("%d ",i1); i2++;} return 0; }
@Atrox
Das mit dem arrray als rückgabewert hab ich net bedacht aber ich bin net gerade sattelfest in c
. Auf das main hab ich ehrlichgesagt net gschaut. Hätte es vielleicht umbennen sollen. Bringt denn das was das main mit int rückgabewert zu definieren wenn man nix zurückgibt ??
Mit mod schaut das ganze schon viel schöner aus.
Frage in c kann man einfach ein offensichtlich nicht immer int ergebnis von sqrt in einen int haun? (Jetzt oute ich wahrscheinlich grad als ärgerer n00b
)
also ... thx für eure hilfe ... irgendwie bekomme ich keinese so richtig zum laufen ... ich schau mir das nochmal an ....
aber auf jedenfall schon jetzt danke ....
zuerst hatte ich sqrt() in der bedingung drinstehen, aber dann wird es jedesmal neu berechnet und das ist verschwendung. gerade bei typenumwandlungen ist C sehr offen und lasch. allerdings gilt zu beachten:
warum?Code:int a=4,b=20,s; a<sqrt(b) -> true s=sqrt(b); a<s -> false
also bei mir funkt atrox's version mit einem copy und paste in cygwin mit gcc.
Jetzt hab ich auch endlich verstanden wie die ausgabe aussehen soll 
edit: zuviel zeit gelassen mit dem antworten. Net schlecht ich glaub ich sollt mich mal mehr mit c beschäftigen. genau diese sachen ärgern mich oft in java das es sowas net automatisch macht sonder nen cast braucht.
also, ich kann dir zwar nicht genau sagen, wie es geproggt wird, weil ich c nicht kann, aber so ungefähr kann ich dir eine optimierte lösung geben, hab mir das alles mal überlegt:
wenn man genau nachdenkt, dann muss man eine zahl (zb 50) immer nur durch alle primzahlen, die darunter liegen dividieren, um zu überprüfen, ob die aktuelle eine eben solche ist - denn 1,2,3 sind ja bekanntlich primzahlen, so geht das natürlich ohne array garnet - deswegen schätz ich mal, das war die aufgabe 
(ich schreibs dir mal in php hin, weil ich c net kann, vielleicht kanns dir wer 'übersetzen' - sollte aber ähnlich sein)
Code: PHPfunction primes($lenght) { $primeValues = array(2); echo '1 *<BR>2 *'; if($lenght<3) { exit; } for($i = 3;$i<=$lenght;$i++) { echo '<BR>'.$i; foreach($primeValues as $dummy) { if(intval($i/$dummy)*$dummy==$i) { $is_prime = FALSE; break 1; } else { $is_prime = TRUE; } } if($is_prime==TRUE) { array_push($primeValues,$i); echo ' *'; } } }



Zitat von watchoutZitat von DKCHhab nur ich lokomotiven als etwas grössere gebilde in erinnerung?
wie konkret spielt sich bei einer geschwindigkeit über 50 km/h dieser vorgang ab?
also, das einzige mal, wo characters mit ints vermischt werden, is beim echo und ich dort nur wegen dem <BR>, welches ja im c nicht notwendig istZitat von VivoDas Prob is in C kannst nicht so einfach die Charakters mit ints vermischen...
Die Syntax von PHP is zwar ähnlich, aber sachen wie foreach und array_push muss man alles selbst ausproggen ...
)@watchout ... hast recht ... das array_push entspricht zwar einem dyn. Array aber das braucht man ja hier nicht ...
Code:#include <stdio.h> void main(void) { char zahlen[200]; int i1,i2,ist_primzahl; char W=1,F=0; for( i1 = 0 ; i1 <= 99 ; i1 += 2 ) { zahlen[i1] = i1; ist_primzahl = W; if (i1==1) ist_primzahl=F; for(i2=2;i2<i1;i2++) { if ((i1/i2)*i2==i1) ist_primzahl=F; } if (ist_primzahl==W) zahlen[i1+1] = "*"; else zahlen[i1+1] = " "; } }

Zitat von watchoutwenn man genau nachdenkt, dann muss man eine zahl (zb 50) immer nur durch alle primzahlen, die darunter liegen dividieren, um zu überprüfen,
Code:#include <stdlib.h> #include <stdio.h> #define n 100 int main() { int e[n]={1,2}; int ei=2,i1,i2,s; for (i1=3;i1<n;i1++) { for (i2=1;i2<ei&&i1%e[i2];i2++); if (i2>=ei) e[ei++]=i1; } for (i1=1,i2=0;i2<ei && i1<n;i1++) if (e[i2]>i1) printf("* "); else {printf("%d ",i1); i2++;} return 0; }
@VIVO: wenn man schon eine map aller zahlen macht, dann ist das Sieb effizienter.
aber gut das es noch viele viele andere primzahlen algorithmen gibt 
Zitat von atroxzuerst hatte ich sqrt() in der bedingung drinstehen, aber dann wird es jedesmal neu berechnet und das ist verschwendung. gerade bei typenumwandlungen ist C sehr offen und lasch.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026