|
|
| Autor |
Nachricht |
x² Senior Member

 Anmeldungsdatum: 05.06.2005 Beiträge: 1151 Wohnort: München
|
Verfasst am: 09 Feb 2010 - 18:36:04 Titel: C++ Anfänger, Primzahl-Programm |
|
|
Ich versuche mich seit kurzer Zeit an C++ und hab nun ein Programm geschrieben, mit dem ich mir eigentlich alle Primzahlen bis 100 auflisten lassen wollte, doch das funktioniert leider nicht so, wie ich es möchte. Die 1 und die 2 hab ich direkt außen vorgelassen, weil mir keine Möglichkeit einfällt, die beiden Zahlen in die Berechnung mit hinein zu bekommen. Hier erstmal das Programm:
#include <iostream>
using namespace std;
int main()
{
int x, i;
for(x=3; x<=100; x++) {
for(i=2; i<x; i++) {
if(x%i==0) break;
if(x%(x-1)!=0) cout << x << " ist prim.\n";
}
}
return 0;
}
Ich hab also versucht, mit einer Schleife alle Zahlen von 3 bis 100 durchlaufen zu lassen und mit der zweiten Schleife wollte ich jede Zahl durch alle Zahlen teilen, die kleiner sind als sie selbst. Wenn sie sich nicht ohne Rest teilen lässt, ist sie ja schließlich prim. Ich weiß, das ist bestimmt nicht sehr elegant und wirkt eher wie ne Hau-drauf Methode, aber meine Programmierkenntnisse sind noch sehr begrenzt.
Nun meine Frage, wo liegt der Fehler in meinem Programm? Oder ist der Fehler prinzipieller Natur? Muss ich an das Problem anders rangehen?
EDIT: Kann es sein, dass es an der Zeile
if(x%(x-1)!=0) cout << x << " ist prim.\n";
liegt? Das führt er einfach jedes Mal aus, auch wenn i noch gar nich bis x-1 durchgelaufen ist oder? Wie kann ich das denn anders formulieren, damit es stimmig ist? |
|
 |
Annihilator Senior Member

 Anmeldungsdatum: 18.05.2007 Beiträge: 6395 Wohnort: (hier nicht mehr aktiv)
|
Verfasst am: 09 Feb 2010 - 19:22:20 Titel: |
|
|
| Code: |
#include <stdio.h>
int main()
{
int x, i;
for (x = 3; x <= 100; x++)
{
for (i = 2; i < x; i++)
{
if (x%i == 0) break;
}
if (i == x) printf("%i ist eine Primzahl.\n", x);
}
return 0;
}
|
_________________ Schnauze voll von Error 500 und co?
bildungs-foren.de |
|
 |
x² Senior Member

 Anmeldungsdatum: 05.06.2005 Beiträge: 1151 Wohnort: München
|
Verfasst am: 09 Feb 2010 - 19:54:02 Titel: |
|
|
Ah natürlich. Das klingt logisch. Vielen Dank.
Aber eine neue Frage stellt sich mir da noch. Wenn im for loop die Bedingung i < x angegeben ist, wie kann denn dann innerhalb des Loops die Bedingung i==x erfüllt sein? Soweit sollte i doch gar nicht durchlaufen oder?
EDIT: Hat sich erledigt. Hab mir das nochmal genau angeguckt. i==x ist ja gar nicht innerhalb des Loops. Vielen Dank nochmal  |
|
 |
CNlerin Senior Member

Anmeldungsdatum: 17.08.2008 Beiträge: 692
|
Verfasst am: 10 Feb 2010 - 00:15:21 Titel: |
|
|
Nur so als Tipp...
Nach dem Primzahlen, von der 2 mal abgesehn, immer ungerade sind würde ich in der ersten for schleife auch nur jede ungerade Zahl prüfen
for (x = 3; x <= 100; x=x+2){
...
} |
|
 |
Annihilator Senior Member

 Anmeldungsdatum: 18.05.2007 Beiträge: 6395 Wohnort: (hier nicht mehr aktiv)
|
Verfasst am: 10 Feb 2010 - 11:47:48 Titel: |
|
|
Begründung? _________________ Schnauze voll von Error 500 und co?
bildungs-foren.de |
|
 |
Jockelx Senior Member

Anmeldungsdatum: 24.06.2005 Beiträge: 3255
|
Verfasst am: 10 Feb 2010 - 14:28:29 Titel: |
|
|
| Annihilator hat folgendes geschrieben: | | Begründung? |
Wofür? Das Primzahlen grösser 2 alle ungerade sind!? |
|
 |
Annihilator Senior Member

 Anmeldungsdatum: 18.05.2007 Beiträge: 6395 Wohnort: (hier nicht mehr aktiv)
|
Verfasst am: 10 Feb 2010 - 19:03:44 Titel: |
|
|
Toll! Primzahlen größer 3 sind auch alle nicht durch 3 teilbar. Und stell dir vor: Die, die größer als 5 sind, sind auch nicht durch 5 teilbar! _________________ Schnauze voll von Error 500 und co?
bildungs-foren.de |
|
 |
Jockelx Senior Member

Anmeldungsdatum: 24.06.2005 Beiträge: 3255
|
Verfasst am: 10 Feb 2010 - 20:17:31 Titel: |
|
|
Dass Primzahlen > 2 nicht durch 2 teilbar sind, ist offensichtlich und lässt sich
in der Schleife einfach umsetzen.
Dass Primzahlen > 15349851 nicht durch 15349851 teilbar sind, stimmt auch, interessiert aber keinen.
Also nochmal: Was willst du warum begründet haben? |
|
 |
Annihilator Senior Member

 Anmeldungsdatum: 18.05.2007 Beiträge: 6395 Wohnort: (hier nicht mehr aktiv)
|
Verfasst am: 10 Feb 2010 - 20:59:15 Titel: |
|
|
Dass man das Programm optimieren kann, steht meines Erachtens außer Frage. Schwierig umzusetzen, ist die Sache für 3 auch nicht:
| Code: |
x = ((x+2)%3) ? x+2 : x+4
|
Ich fand es jedenfalls überflüssig zu erwähnen, denn wenn man das weiter spinnt, dann benötigt man erstmal alle Primzahlen, um zu wissen, welche x man überspringen kann. _________________ Schnauze voll von Error 500 und co?
bildungs-foren.de |
|
 |
CNlerin Senior Member

Anmeldungsdatum: 17.08.2008 Beiträge: 692
|
Verfasst am: 10 Feb 2010 - 21:25:35 Titel: |
|
|
| Annihilator hat folgendes geschrieben: | Dass man das Programm optimieren kann, steht meines Erachtens außer Frage. Schwierig umzusetzen, ist die Sache für 3 auch nicht:
| Code: |
x = ((x+2)%3) ? x+2 : x+4
|
Ich fand es jedenfalls überflüssig zu erwähnen, denn wenn man das weiter spinnt, dann benötigt man erstmal alle Primzahlen, um zu wissen, welche x man überspringen kann. |
Naja wenn du die primzahlen schon kennst brauchst ja kein programm mehr. Aber wenn ich die anzahl der zahlen die überhaupt in frage kommen können schon von vornherein auf die hälfte reduzieren kann, macht das meiner meinung nach durch aus sinn.
Ich sagte ja nicht das deine lösung falsch ist, und bei 100 Zahlen spielt das sicher auch nicht so die rießen rolle, aber das ist so simpel das man das einfach so mal machen kann ohne viel hirnschmalz rein stecken zu müssen. |
|
 |
|