kostenloser Webspace werbefrei: lima-city


Primzahlen-Problem

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    a******a

    Hi Leute :biggrin:
    ich brauch mal dringend eure Hilfe f?r ein kleines Schulprojekt.
    Hier die Aufgabe:
    Aus den ersten 200 nat?rlichen Zahlen sollen die Primzahlen "herausgefiltert" und angezeigt werden.
    vielen dank im vorraus
    mfg athrubia
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Die bekannteste Methode zur Primzahlberechnung ist das "Sieb des Eratosthenes".

    http://de.wikipedia.org/wiki/Primzahltest#Sieb_des_Eratosthenes

    Allerdings musst du den Code nach C selbst portieren. Das d?rfte aber nicht schwer sein.
  4. g**o

    ich hab das ganze mal vor kurzem mit delphi gemacht.. auch nach diesem eratosthenes prinzip.. wenn du m?chtest schicke ich dir den code.. du musst ihn dir dann nur noch in c/c++ ?berstetzen.. mit dem prog kannst du soviele primzahlen erechnen wie du willst.. nur ab 1mio wird er seeeehhhhhhhrrrrrrr langsam^^

    greez
    gero

    p.s. schick mir ne pn wenn dus haben willst
  5. 0******a

    Kommentare sollten alles erkl?ren


    #include <stdio.h>

    #define SEARCH_END 200

    int main(void)
    {
    &nbsp;&nbsp;&nbsp;unsigned short int usNumber; // aktuelle Zahl
    &nbsp;&nbsp;&nbsp;unsigned short int usNumberCount;&nbsp;&nbsp;&nbsp;// Anzahl der zu ?berpr?fenden Zahlen
    &nbsp;&nbsp;&nbsp;bool bPrintIt;

    &nbsp;&nbsp;&nbsp;printf("2\n"); // 2 ist die einzige gerade und erste Primzahl
    &nbsp;&nbsp;&nbsp;usNumber = 3;

    &nbsp;&nbsp;&nbsp;// Anzahl der ungerdaden Zahlen ab 3 bis SEARCH_END bestimmen
    &nbsp;&nbsp;&nbsp;usNumberCount = SEARCH_END / 2 - 1;

    &nbsp;&nbsp;&nbsp;// Falls SEARCH_END ungerade ist, ist usNumberCount 1 zu klein
    &nbsp;&nbsp;&nbsp;if (SEARCH_END % 2)
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usNumberCount++;

    &nbsp;&nbsp;&nbsp;for (int iMain = 0; iMain < usNumberCount; iMain++)
    &nbsp;&nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bPrintIt = true;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usNumber = iMain * 2 + 3; // nur ungerade Zahlen ab 3 untersuchen

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Diese Schleife wird beim ersten Mal nicht durchlaufen,
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// da iMain * 2 + 3 => 0 * 2 + 3 = 3 und i ebenfalls 3
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 3; i < usNumber; i++)
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((usNumber % i) == 0)&nbsp;&nbsp;&nbsp;// kein Rest, Zahl ist also teilbar
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bPrintIt = false;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// n?chstes printf nur zur Kontrolle, sonst auskommentieren
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%u teilbar durch %i\n", usNumber, i);
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (bPrintIt)
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%i\n", usNumber);
    &nbsp;&nbsp;&nbsp;}

    &nbsp;&nbsp;&nbsp;return 0;
    }


    p.s.:
    Hab den Link von alopex mal angeschaut. Scheint das gleiche Verfahren zu sein bis auf das Auslassen von geraden Zahlen.
    p.s.2: Um gr?ssere Zahlen zu untersuchen m?ssen die Typen ge?ndert werden. Das hier funktioniert nur bis 2 hoch 16 (ca. 65.000).

    Beitrag ge?ndert am 5.01.2006 14:23 von 0-checka


    Mir ist nochwas eingefallen:
    Man kann das nochmals optimieren, wenn man auch bei der Variable i die geraden Zahlen ?berspringt, denn ungerade Zahlen lassen sich nicht durch gerade teilen. Beweis:
    Definition ungerade Zahl = Zahlen die nicht ohne Rest durch 2 teilbar sind
    x = ungerade Zahl
    y = irgendeine gerade Zahl
    x / y <=> x / 2 * (y / 2)
    Da x / 2 keine ganzzahlige L?sung hat ist der Term im Bereich der Zahlen ?ber N nicht aufl?sbar.

    Beitrag ge?ndert am 5.01.2006 14:34 von 0-checka
  6. g**o

    und funzt das prog?? das m?sste wie gesagt bis unendlich laufen k?nnen.. nur das du unnormal lange warten musst^^.. also wenn du ?ber 1mio gehst^^.. du kannst aber in dem edit feld die anzahl begrenzen..

    greez
    gero

    p.s. poste mal plz ob dus ?bersezt bekommen hast und schick am besten direkt den code mit.. aslo wenns standart c/c++ sein sollte
  7. Autor dieses Themas

    a******a

    @gero:
    ja ich hab das programm bekommen und es funzt auch einwandfrei, aber wie komm ich an den Code?
  8. g**o

    der steht in der datei unit1.pas
    aber ich empfehle dir den borland delphi7.0 oder spo runterzuladen.. damit kannst du dann das ganze projekt ?ffnen..

    vom code her kannst du in der unit1.pas alles bis procedure TForm1.Button1Click(Sender: TObject); ignorieren.. das ist nur borland pascal/delphie zeugs was du so garnet brauchst..

    greez
    gero
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!