Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Primzahlen in cpp

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
09.12.2005, 22:37 Uhr
~Florian
Gast


Hi,

ich bin noch relativ neu in C++ und habe mich gerade an einem Programm versucht, dass ermitteln soll, ob eine zahl eine Primzahl ist. Könntet ihr mir sagen, was an meinem code falsch ist, ich finde nichts...

Code:

C++:

#include <iostream>

using namespace std;

int istprim()
{
cout<<"Welche zahl moechten Sie ueberpruefen?"<<endl;
int kandidat;
cin>>kandidat;
int testzahl = 2;
bool kandidatprim;
int x;

while(testzahl < kandidat)
{

x = testzahl % kandidat;

switch (x)
{
case 0:
kandidatprim = false;
testzahl = kandidat;
break;

default:
kandidatprim = true;
break;
};


testzahl++;
};

if(kandidatprim == true)
cout<<kandidat<<" ist keine Primzahl"<<endl;

else;
cout<<kandidat<<" ist eine Primzahl"<<endl;

return 0;
};



int main()
{
istprim();

int nichtschliessen;
cin>>nichtschliessen;


return 0;

}



Vielen dank für eure Hilfe;
greez Florian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.12.2005, 01:33 Uhr
ethone




C++:
else[b];[/b]
cout<<kandidat<<" ist eine Primzahl"<<endl;

Erstmal muss das Semikolon hinter dem else weg, daher kommt es nämlich, dass du immer beide Ausgaben bekommst.
Ansonsten musst du eigentlich nur die boolean Werte im Switch umdrehen (oder unten in der Ausgabe), die hast du vertauscht. Wenn du als Rest 0 rausbekommst ist es KEINE Primzahl.
In der IF-Abfrage am Ende auf Boolsche Werte kannst du den Vergleich mit True rausnehmen, wenn du nur if(abc) da stehen hast, wird der if-Block betreten, wenn die Variable abc "true", also entweder boolean true oder ungleich 0 ist.

Hier mal eine editierte Version, die augenscheinlich läuft:



C++:
#include <iostream>

using namespace std;

int istprim()
{
cout<<"Welche zahl moechten Sie ueberpruefen?"<<endl;
int kandidat;
cin>>kandidat;
int testzahl = 2;
bool kandidatprim;
int x;
    while(testzahl < kandidat)
    {      
        x = kandidat % testzahl;    
            switch (x)
                {
                case 0:
                kandidatprim = true;
                testzahl = kandidat;
                break;
                
                default:
                kandidatprim = false;
                break;
                };        
        testzahl++;
    };
if(kandidatprim)
{cout<<kandidat<<" ist keine Primzahl"<<endl;}

else
cout<<kandidat<<" ist eine Primzahl"<<endl;

return 0;
};



int main()
{
istprim();

int nichtschliessen;
cin>>nichtschliessen;

return 0;
}

Is spät, ich garantiere für nichts. Hab's für eine handvoll Zahlen ausprobiert und soweit mein Gedankenapparat noch kann auch durchdacht.

Dennis
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.12.2005, 03:15 Uhr
0xdeadbeef
Gott
(Operator)


Das hier ist eine etwas optimiertere Variante:

C++:
#include <iostream>

using namespace std;

bool isprime(unsigned x) {
  unsigned i, j;

  if(x == 2 || x == 3 || x == 5 || x == 7) return true;
  if(x % 2 == 0 || x % 3  == 0 || x % 5 == 0 || x % 7 == 0) return false;

  for(i = 3, j = 2; i * i <= x; i += j, j = 6 - j)
    if(x % i == 0) return false;

  return true;
}

int main() {
  unsigned zahl;

  cout << "Zahl eingeben: ";
  cin >> zahl;

  cout << zahl << " ist " << (isprime(zahl) ? "" : "nicht ") << "prim" << endl;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.12.2005, 17:44 Uhr
~Florian
Gast


Danke Sehr!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.12.2005, 15:59 Uhr
~Aconcagua
Gast


Leider fehlerhaft, z. B. wird 169 als Primzahl erkannt:

Testzahlen:
i = 3, j = 2
i = 5, j = 4
i = 9, j = 2
i = 11, j = 4 (!)

jetzt wird die 13 übersprungen...

Abwechselnd +2, +4 führt immer wieder dazu, dass Primzahlen übersprungen werden, auch wenn man zuerst +4 ausführt.

Ganz nebenbei hätte man mit i = 11 beginnen können, da die kleineren Primzahlen bereits in der if-Anweisung abgeprüft wurden.

Unschön ist noch, dass die 1 als Primzahl erkannt wird, die aber keine ist.

So sollte es klappen:

[cpp]
bool isprime(unsigned x) {
if(x == 2 || x == 3) return true
if(x < 2 || x % 2 == 0) return false;

for(unsigned i = 3; i*i <= x; i += 2)
while(i*i <= x) {
if(x % i == 0) return false;
i += 2;
}
[/cpp]

Das ganze ist allerdings überaus ineffizient (gib mal recht große Zahlen ein...), in entsprechender Fachliteratur findet man wesentlich bessere Algorithmen (z. B. Cormen, Leiserson, Rivest: Introduction to Algorithms, auch auf dt. erhältlich).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.12.2005, 16:07 Uhr
~Aconcagua
Gast


Pardon, war Blödsinn, die while-Schleife muss natürlich raus...


C++:
bool isprime(unsigned x) {
   if(x == 2 || x == 3) return true
   if(x < 2 || x % 2 == 0) return false;

   for(unsigned i = 3; i*i <= x; i += 2)
      if(x % i == 0) return false;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.12.2005, 16:12 Uhr
Aconcagua



Ganz schlechter Tag heute...


C++:
bool isprime(unsigned x) {
   if(x == 2 || x == 3) return true;
   if(x < 2 || x % 2 == 0) return false;

   for(unsigned i = 3; i*i <= x; i += 2)
      if(x % i == 0) return false;
   return true;
}



Hätte mich gleich registrieren sollen, dann hätte ich den ganzen Müll einfach korrigieren können...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: