Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Primzahlen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.06.2004, 17:34 Uhr
~Shep
Gast


Hallo,

ich bin ganz neu angefangen mit dem c++ programmieren. Deshalb habe ich eine Frage. Ich will ein Programm schreiben, dass mir alle Primzahlen von 1 bis 100 auflistet.
Mein Versuch klappt allerdings nicht. Ich finde aber auch nicht den Denkfehler, ich wäre sehr dankbar wenn mir jemand weiterhelfen könnte.

C++:
#include <iostream.h>

void main()
{
    
    for(int kandidat=1;kandidat<101;kandidat=kandidat+1)
    {    
        for(int teiler=2;teiler<kandidat-1;teiler=teiler+1)
            if(kandidat%teiler==0)
            {
                ;
            }
            else
                cout<<kandidat<<endl;
    };        
                    
};


Mfg
Shep

Bearbeitung von Pablo:

Benutze CPP Tags selber, Danke.


Dieser Post wurde am 23.06.2004 um 17:37 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.06.2004, 17:39 Uhr
Pablo
Supertux
(Operator)


1. Du brauchst keine ; am Ende der geschweiften Klammer }
2. was funktioniert nicht? falsche Ausgabe?

Übrigens, das hat mit WinAPI nix zu tun, deshalb in ANSI Forum verschoben, aber damit es dort passt, dann muss main int sein und nicht void
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.06.2004, 17:44 Uhr
~Shep
Gast


ja ich bekomme eine falsche Ausgabe. Und zwar listet er mir jeweils die 97,98,99 und 100 ca. 25Mal auf. Und das sind schleißlich keine Primzahlen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.06.2004, 17:44 Uhr
Frodenius



a) arbeite doch übersichtlicher mit whitespaces und bei Anweisungen mit mehr als einer Zeile mit {} (s. 2. for-Schleife). Zudem kannst du das var=var+1 auch durch var++ bzw. prefix ++var ersetzen!
b)der denkansatz ist zwar ganz gut, aber du hast nicht bedacht, das Primzahlen !nur! durch 1 und sich selbst zu teilen sind!

Ansonsten gibt der code wahrscheinlich alle nicht durch 2 teilbaren Ganzzahlen aus, also alle ungeraden.
--
NI! ...and thanks for all the fish!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.06.2004, 17:48 Uhr
Frodenius



Ähh... nein quatsch, der Post war grad mist!(zu schnell gedacht, zu langsam gelesen.das mit den ungeraden...) aber a) und b) stimmen soweit.
--
NI! ...and thanks for all the fish!

Dieser Post wurde am 23.06.2004 um 17:57 Uhr von Frodenius editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.06.2004, 17:55 Uhr
Frodenius



Also bei mir gibt der Code die Zahlen von 1-100 so oft aus, wie es Teiler-1 darunter gibt (weil du mit 2 anfängst.) Das liegt wahrscheinlich daran, dass bei einer Teilung nie 0 rauskommt, und du ja immmer alle Teiler neu durchgehst.(nach der erhöhung von kandidat.)
--
NI! ...and thanks for all the fish!

Dieser Post wurde am 23.06.2004 um 18:01 Uhr von Frodenius editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.06.2004, 17:58 Uhr
virtual
Sexiest Bit alive
(Operator)


Der algo ist falsch: geringfügig beser wäre:

C++:
#include <iostream>

int main()
{
    
    for(int kandidat=1;kandidat<101;kandidat=kandidat+1)
    {    
        bool istPrimzahl = true;

        for(int teiler=2;istPrimzahl && teiler<kandidat; teiler++)
        {
            istPrimzahl = kandidat%teiler!=0;
        }
        if (istPrimzahl)
        {
            std::cout<<kandidat<<std::endl;
        }
    }                        
}


Du kannst das aber noch sehr weitgehend optimieren:
Zunächst ist klar, daß 2 die einzige durch zwei teilbar Primzahl ist, sie ist sogar die erste. Alle anderen Primzahlen sind ungrade. Deshalb kann man kandidat dann immer um zwei hochzählen:

C++:
...
    std::cout<<2<<std::endl;
    for(int kandidat=3;kandidat<101;kandidat+=2)
    {    
        bool istPrimzahl = true;

        for(int teiler=2;istPrimzahl && teiler<kandidat; teiler++)
        {
            istPrimzahl = kandidat%teiler!=0;
        }
        if (istPrimzahl)
        {
            std::cout<<kandidat<<std::endl;
        }
    }                        
...


Weiterhin kann man sagen, daß als Teiler nur die zahlen in Frage kommen, die kleiner oder gleich der Wurzel von kandidat sind:

C++:
...
    std::cout<<2<<std::endl;
    for(int kandidat=3;kandidat<101;kandidat+=2)
    {    
        bool istPrimzahl = true;

        for(int teiler=3;istPrimzahl && teiler*teiler<=kandidat; teiler+=2)
        {
            istPrimzahl = kandidat%teiler!=0;
        }
        if (istPrimzahl)
        {
            std::cout<<kandidat<<std::endl;
        }
    }                        
...


Speziell für Deine Aufgabe möglichweise schon eine akzeptable Lösung; für größere zahlenbereiche solltest Du dann vielleicht mit dem sieb arbeiten.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.06.2004, 18:02 Uhr
~Shep
Gast


Vielen Dank für die Antworten. Hat mir weitergeholfen!

MfG
Shep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: