Anzeige:
Ergebnis 1 bis 5 von 5

Thema: mein c++ programm funktioniert nicht so wie ich will

  1. #1
    Registrierter Benutzer
    Registriert seit
    09.05.2001
    Ort
    75196 remchingen
    Beiträge
    26

    mein c++ programm funktioniert nicht so wie ich will

    begeistert von c++ hab ich mich gestern hingeschrieben das alle primzahlen von 1 bis n bestimmen und anzeigen soll. aber es klappt nicht so wie ich es will. anstatt alle primzahlen auszugeben gibt es alle ungeraden zahlen aus (bei max=200 fehlt die 19 und bei max=150 bleibt es hängen).

    noch kurz die erklärung wie es funktionieren soll: aufgebaut ist es auf dem sieb des eratosthenes. erst werden alle zahlen durch 2 geteilt. die zahlen die teilbar sind werden im array primzahlen mit 0 überschrieben. danach wird die nächstgrößere zahl im array primzahlen genommen und es werden alle zahlen im array durch diese geteilt und es geht wieder von vorne los. zum schluss müssten alle zahlen die nicht 0 sind primzahlen sein. hier der programmcode:

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    #include <iostream.h>
    #include <stdlib.h>

    int main()
    {
    int max;
    cout << "Bitte angeben bis zu welcher Zahl Primzahlen errechnet werden sollen: ";
    cin >> max;
    cout << endl;
    //max = 100;
    int zahlen[max];
    int primzahlen[max];
    int j = 0;
    int count;
    //fills zahlen array with numbers from 1 to max
    for (count = 0; count < max; count++)
    {
    if (max == 0)
    {
    break;
    }
    zahlen[count] = count + 1;
    //cout << zahlen[i] <<endl;
    }
    j = 0;
    int end = 2;
    count = 0;
    while (end <= max)
    {

    while (count <= max)
    {
    count++;
    if (zahlen[count] % end == 0 && zahlen[count]!= end)
    {
    primzahlen[count] = 0;
    }
    //cout << primzahlen[count] <<endl;
    }

    for (count = 0; count <= max; count++)
    {
    if (primzahlen[count] > end)
    {
    end = primzahlen[count];
    break;
    }
    }

    }

    count = 0;
    int i = 1;
    while (count <= max)
    {
    if (primzahlen[count] != 0)
    {
    primzahlen[count] = zahlen[count];
    cout << i << ". " << primzahlen[count] <<endl;
    i++;
    }
    count++;
    }

    return 0;
    }

    hoffentlich könnt ihr mir helfen
    software is like sex it's better when it's free

  2. #2
    Registrierter Benutzer
    Registriert seit
    21.01.2001
    Beiträge
    157
    Dein Code hat etliche Probleme:
    [list][*]int max; max = ... ; int array[max]; // Das ist kein C++, das geht nur mit g++, Benutze mal die Flags "-ansi -pedantic -Wall" mit dem g++[*] if (max == 0){break;} // Diese Stelle wird nie erreicht, falls (max == 0)[*] Das Array primzahlen wird nie initizialisert.[*] Ein Array mit a[j] = j oder a[j] = j + 1 oder a[j] = j - 1 ist meist relativ sinnlos, da der Inhalt ja schon im Index codiert ist.[*] Es scheint Dir nicht ganz klar was wann in primzahlen und in zahlen steht:[*]
    1. zuerst initialisierts Du zahlen mit zahlen[j]= j + 1
    2. primzahlen vergisst Du, da steht nur Müll drin, aber wahrscheinlich soll es genauso aussehen.
    3. Dann überschreibst Du die Vielfachen der kleinsten Primzahl in primzahlen mit 0.
    4. Nun suchst Du die naechst höhere Primzahl. Der Vergleich (primzahlen[count] > end) legt die Vermutung nahe, das Du primzahlen wie zahlen initialisieren wolltest.
    5. Wieiter unten mach primzahlen[count] = zahlen[count]; keinen sinn, wenn primzahlen genauso initialisert sein soll wie zahlen[/list=1]


    Ich hab mich mal an einer einfacheren Version probiert:

    Code:
    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <vector>
    
    int main()
    {
      // Benutzereingabe
      int max;
    
      std::cout << "Bitte angeben bis zu welcher Zahl Primzahlen errechnet werden sollen: ";
      std::cin >> max;
      std::cout << std::endl;
    
      // Die Initialisierung
      std::vector<bool> istPrim(max + 1, true);
      istPrim[0] = false;
    
      // Das Sieben
      for (unsigned int i = 2; i <= istPrim.size(); i++) {
        if (!istPrim[i]) continue;
        for (unsigned int j = 2 * i; j <= istPrim.size() ; j += i) 
          istPrim[j] = false;
      }
    
      // Die Ausgabe
      for (unsigned int i = 0, j = 1; i <= istPrim.size(); i++) 
        if (istPrim[i]) 
          std::cout << j++ << ". " << i << std::endl;
      
      return 0;
    }

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.05.2001
    Ort
    75196 remchingen
    Beiträge
    26
    int max; max = ... ; int array[max]; // Das ist kein C++, das geht nur mit g++, Benutze mal die Flags "-ansi -pedantic -Wall" mit dem g++

    wie löst man das besser? ich hab vorher c geproggt.

    was macht bei deinem programm std:: ??? und was steht in vector?
    software is like sex it's better when it's free

  4. #4
    Registrierter Benutzer
    Registriert seit
    21.01.2001
    Beiträge
    157
    Hier mal zwei links:
    http://www.voyager.prima.de/cpp/usingstd.html
    http://www.msoe.edu/eecs/ce/courseinfo/stl/

    ... und noch ein Tip. Kauf/Leih Dir ein Buch zu ISO-C++. Das ist der gültige Standard für C++. Da es C++ schon etwas länger als den Standard gibt, ist aber leider viel Lehrmaterial etwas veraltet. Aber was aus den letzten drei Jahren stammt sollte eigentlich aktuell sein.

    Und hier noch ein link (auch wenns erstmal zuviel sein wird):
    http://www.cs.rpi.edu/~musser/ap/c++std/cd2/index.html

  5. #5
    Leon1A
    Gast
    Hi,
    Hier ist ein algo, der vielleicht etwas schneller ist:

    #include <stdio.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>

    void Primzahlen(unsigned int Max_za,int Prim_za[8000] )
    {
    int Primlaenge,primz;
    unsigned int Halt,Test;
    int Wurzel,j;

    Primlaenge = 2;
    Prim_za[0]= 2;
    Prim_za[1]= 3;
    Wurzel = sqrt(Max_za)+30000;
    for (Test=5; Test <= Wurzel ; Test+=2)
    {
    Halt = 4;
    primz = 0;
    for (j=0; Prim_za[j]<=Halt; j++)
    {
    if ( (Test%Prim_za[j]) != 0) {
    Halt = Test/Prim_za[j];
    }
    else {primz=1;break;}
    } // ende 2. for
    if ( primz==0) {
    Prim_za[Primlaenge] = Test;
    Primlaenge +=1;
    }
    } // ende 1. for
    } // ende Primzahlen

    /* bei Max_za = 65536 gibt es ca. 6500 Primzahlen. Erhöhe den Array, falls in einem größeren Bereich nach Primzahlen suchst.

    Postet (alle) mal eine Bewertung, ob der Code gut ist (Schnell, Speichersparend, etc...)

    Hat jemand Erfahrungen mit Thread Programmierung? Kann mir vorstellen, dass sich das hier auszahlt.

    Léon

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •