Zum Inhalt springen

Suche Hilfe bei einer Primzahlberechnung in C++


Phade

Empfohlene Beiträge

  • Antworten 62
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

zahl1 / zahl1 = zahl2; // zahl1 durch zahl1 teilen, zahl2 kommt heraus

Erstens steht bei einer Zuweisung das Ziel (also die Variable, in der der Wert abgelegt werden soll) auf der linken Seite. Also wenn überhaupt, dann

zahl2 = zahl1 / zahl1;

Zweitens: zahl1 / zahl1 ist 1, egal, welchen Wert zahl1 hat (außer Null, da ist es undefiniert).

zahl2 / 1 = ausgabe; // zahl2 durch 1 teilen, ausgabe kommt heraus

Auch hier: Das Ziel der Zuweisung muss links stehen. Und zahl2 geteilt durch 1 bleibt zahl2.

Man könnte also zusammenfassen;

zahl2 = 1;
ausgabe = zahl2; // und damit ausgabe = 1;[/CODE]

Das ist offensichtlich Unsinn.

Deine Kommentare an den Zeilen helfen da auch nicht weiter, weil sie nur wiedergeben, was der Code [i]macht[/i]. Das wissen wir schon. Um dieses Problem zu lösen, müssen wir von dir wissen, was dieser Code [i]tun soll[/i]. Denn das sind offensichtlich zwei unterschiedliche Dinge.

Erklär uns, [i]warum[/i] du gerade diese Rechenschritte machst, dann kommen wir der Lösung näher.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, hier ist meine Erklärung:

Ich möchte ja die Primzahlen einer beliebigen Zahl x berechnen lassen.

Bekanntlich sind Primzahlen ja nur durch 1 und durch sich selber teilbar. Deshalb habe ich geschrieben, dass die eingabe zahl1 werden soll und dannzahl1 durch sich selber teilen zu lassen. Das Ergebnis soll dann zahl2 sein, die dann durch 1 geteilt werden soll und das Ergebenis soll dann die ausgabe sein.

In der Schule haben wir ein Ähnliches Programm geschrieben, ebenfalls mit so einer Anweisung und das hat gefunzt. Deshalb bin ich etwas überraschend verwirrt.... :confused: :confused:

Hoffe, ich habe euch nicht so verwirrt.

Bis später dann,

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich möchte ja die Primzahlen einer beliebigen Zahl x berechnen lassen.

Bekanntlich sind Primzahlen ja nur durch 1 und durch sich selber teilbar. Deshalb habe ich geschrieben, dass die eingabe zahl1 werden soll und dannzahl1 durch sich selber teilen zu lassen. Das Ergebnis soll dann zahl2 sein, die dann durch 1 geteilt werden soll und das Ergebenis soll dann die ausgabe sein.

Jetzt dämmert's. ;)

Leider kannst du durch das bloße Durchführen dieser Rechnung nicht bestimmen, ob eine Zahl eine Primzahl ist.

Jede natürliche Zahl ist durch sich selbst und durch 1 teilbar, aber nur Primzahlen sind nicht durch andere Zahlen teilbar.

Um die Teilbarkeit zu testen, brauchst du zuerst mal eine if-Abfrage:


if(a % b == 0)
{
// a ist durch b teilbar
}[/CODE]

% (modulo) liefert den Rest der Division. Ist der Null, geht die Division glatt auf.

Die Formulierung ""Die Zahl hat folgende Primzahlen: "" ist auch Unsinn.

Eine Zahl hat keine Primzahlen. Sie ist eine oder sie ist keine. Sie hat [i]Primfaktoren[/i], aber um die bestimmen zu können, solltest du zuerst ein Programm schreiben, dass prüft, ob eine eingegebene Zahl eine Primzahl ist.

Und um eine Schleife wirst du da nicht herum kommen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ahhhh, jetzt dämmerts mir auch !!!!! :D

Hmm, ok, ich muss also eine Modulo Schleife einbauen, anstatt der if Anweisung ??? (Da waren sie wieder, meine drei Probleme ;) )

Kannst du mir eventuell sagen wo/wie ich das einbauen kann/muss/will/möchte.... ;)

Aber zum glück sind wir ja jetzt übern Berg.... :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ein oder andere if wirst du auch brauchen. ;)

Formulieren wir doch erst mal den Algorithmus:

Um festzustellen, ob eine Zahl eine Primzahl ist, musst du sicherstellen, dass sie nur durch sich selbst und durch eins teilbar ist.

Wenn also eine Zahl durch irgendeine Zahl >1 und <Zahl teilbar ist, ist sie keine Primzahl.

Wir prüfen also alle Zahlen von 2 bis (Zahl-1) und testen, ob Zahl dadurch teilbar ist. Falls ja, ist die Zahl keine Primzahl, und wir sind fertig. Falls nicht, machen wir mit der nächsten Zahl weiter.

Haben wir alle Zahlen getestet, ohne eine gefunden zu haben, durch die die Zahl teilbar ist, ist die Zahl eine Primzahl.

Einverstanden? Dann solltest du das jetzt in Code umsetzen, oder auch in einen PAP/Struktogramm, falls du den Zwischenschritt auch noch machen möchtest.

Eine Anmerkung am Rande:

Der Algorithmus ist nicht optimiert. Aber er tut, was er soll. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, werde dann mal das Programm so umschreiben und hoffe das ich es richtig verstanden habe.

Also, bis nächstes Jahr dann.... :D :floet: (kleiner scherz am Rande)

Gut, werde mein bestes versuchen. Das mit dem PAP/Struktogramm lass ich lieber, da ich auf diesem Gebiet auch noch nicht so Firm bin. Ach ja, da wäre noch eine Frage: Gib es eigendlich ein Struktogramm Programm für Linux, außer den bereits vorhandenen? Mit denen komme ich nicht so gut zu rande....

Abpropo Strucktogramme, ich habe mir das Programm Strukted gezogen und auf meinem 'XP-Heimrechner' installiert. Nun wenn ich ein Struktogramm erstellen möchte sehe ich nur ein weißes Blatt. Das Programm macht alles was ich ihm sage, nur sehen tue ich nichts. Das kuriose ist ja, in der Schule funktioniert es ja einwandfrei und die haben auch nur XP-Rechner.... Hat da vielleicht einer ne Idee?

bis dänne dann, thanx

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ähm, ich nochmal,

kann ich jetzt zum Beispiel schreiben:

if(eingabe % eingabe)

???

Also ich glaube ich hab jetzt knoten im Kopf, stehe voll auf dem schlauch.......hüüüüüllllffffeeeee.....ich glaube ich mache erst einmal Mittag, und versuche es dann nochmal. Ich versteh es nicht. Ich komme nicht drauf wie ich es schreiben soll.....Ach ähm, ist ein for-Schleife angebracht, oder ist eine andere besser???

Ich hoffe ich nerv nicht zu viel, aber irgendwie muss ich das dann doch auch mal in meinen Kopf bekommen....

Link zu diesem Kommentar
Auf anderen Seiten teilen

kann ich jetzt zum Beispiel schreiben:

if(eingabe % eingabe)

???

Kannst du. Ist aber sinnlos.

eingabe % eingabe ist der Rest der Division einer Zahl durch sich selbst. Das ist immer 0.

Ach ähm, ist ein for-Schleife angebracht, oder ist eine andere besser???
Das ist letztlich egal. Eine for-Schleife bietet sich an, wenn du in festen Schritten von einem Startwert zu einem vorher bekannten Endwert laufen musst. So wie hier. ;)

Ich hoffe ich nerv nicht zu viel, aber irgendwie muss ich das dann doch auch mal in meinen Kopf bekommen....
Mach doch erst die Schleife, lass den Modulo-Teil weg, und zeig, was du hast. :)
Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach doch erst die Schleife, lass den Modulo-Teil weg, und zeig, was du hast. :)

Ähm, ist jetzt vielleicht blöd, aber welche Schleife meinst du denn jetzt? Die if- oder for-Schleife :confused:

Ich würde ja sagen du meinst die for-Schleife, da ich den Modulo-Teil in eine if-Schleife packen würde....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Malzeit,

Hier ist der Quelltext den ich bis jetzt habe. Komme aber momentan nicht weiter, habe einen Blackout und komme nicht weiter.....

#include <iostream> // Headerdatei


using namespace std;


int main ()

{

    int eingabe, ausgabe, zahl1, zahl2; // Deklaraton


    for(int ... )

    {

	cout << "Bitte geben Sie eine beliebige Zahl ein: "; cin >> eingabe; // Einlesen der Eingabe mit cin


	if (a % b == 0)

	{


	}

    }

    return 0;

}

Hoffentlich ist etwas richtig...ich bin der Meinung, das irgend etwas falsch ist.....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was heißt "noch"? Sicher brauchst du einen Zähler. Bei for-Schleifen brauchst du immer einen Zähler. Oder erwartest du wirklich, dass

eingabe<=eingabe-1

jemals wahr wird? ;)

AHHHHHHHHH, ich spring hier gleich im Fünfeck!! Warum komme ich denn da nicht von selber drauf!!??

Ok, dann werd ich mich mal wieder an die Tastatur begen... :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, bin leider noch nicht weiter gekommen, habe bis jetzt:

#include <iostream> // Headerdatei


using namespace std;


int main ()

{

    int eingabe, ausgabe, zahl1, zahl2, Zaehler; // Deklaration


    cout << "Bitte geben Sie eine beliebige Zahl ein: "; cin >> eingabe; // Einlesen der Eingabe mit cin


    for(int Zaehler=2; Zaehler<=eingabe-1; Zaehler++)

    {

       	if (eingabe % 1 == 0)

	{

	      // Anweisung

	}


	else

	{

	      // Anweisung

	}

    }

    return 0;

}

Wobei ich aber nun wieder blöd da stehe, weil mir keine passenden Anweisungen einfallen..... Für else würde ich schreiben, das die eingegebene Zahl keine Primzahl ist, da der Rest nicht 0 (null) ist.

Ähm..., vielleicht kann man das Programm ja so schreiben, das es nur die Primzahlen bis zu dieser Zahl ausgibt....???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, bin leider noch nicht weiter gekommen,

Du bist schon ein ganzes Stück weiter gekommen. Das sieht doch schon fast gut aus. :)

int eingabe, ausgabe, zahl1, zahl2, Zaehler; // Deklaration

Wirf da mal alles raus, was du nicht brauchst.

if (eingabe % 1 == 0)

Hier prüfst du, ob eingabe ohne Rest durch 1 teilbar ist. Abgesehen davon, dass das für jede ganze Zahl gilt, machst du bei jedem Schleifendurchlauf dasselbe. Denk noch mal nach, wofür wir die Schleife und ihren Zähler haben. ;)

Für else würde ich schreiben, das die eingegebene Zahl keine Primzahl ist, da der Rest nicht 0 (null) ist.

Andersrum. Wenn der Rest nicht null ist, ist eingabe ja nicht teilbar. Bei Primzahlen ist der Rest immer von Null verschieden. Schau dir nochmal den Algorithmus an.

Ähm..., vielleicht kann man das Programm ja so schreiben, das es nur die Primzahlen bis zu dieser Zahl ausgibt....???

Das geht erst dann, wenn du weißt, wie du prüfst, ob eine Zahl eine Primzahl ist. Und da sitzen wir gerade dran. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, einen Teil habe ich verstanden....

also, ich habe die Deklaration um die zahl2 gekürzt. Das, so finde ich, das einzigste ist, was raus könnte....(?)

Bei der if- und else-Abfrage stehe ich mal wieder auf dem Schlauch...!.... :(

Wir haben doch die Schleife, um die eingabe zwo mal zu Überprüfen. Oder verstehe ich das falsch :confused:

Bin aber schon guten Mutes zu hören, das ich doch schon weiter gekommen bin :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, einen Teil habe ich verstanden....

also, ich habe die Deklaration um die zahl2 gekürzt. Das, so finde ich, das einzigste ist, was raus könnte....(?)

Und was ist mit ausgabe und zahl1? Benutzt du die irgendwo? Nein. Also raus damit.

Wir haben doch die Schleife, um die eingabe zwo mal zu Überprüfen. Oder verstehe ich das falsch :confused:

Wir brauchen die Schleife, weil wir die eingegebene Zahl durch eine Reihe anderer Zahlen teilen müssen.

Ein Beispiel:

Der Benutzer gibt 35 ein.

Schleife von 2 bis 34

Wir prüfen: 35 % 2 ist nicht 0 -> weiter

Wir prüfen: 35 % 3 ist nicht 0 -> weiter

Wir prüfen: 35 % 4 ist nicht 0 -> weiter

Wir prüfen: 35 % 5 ist 0 -> 35 ist keine Primzahl.

Anderes Beispiel:

Der Benutzer gibt 7 ein.

Schleife von 2 bis 6

Wir prüfen: 7 % 2 ist nicht 0 -> weiter

Wir prüfen: 7 % 3 ist nicht 0 -> weiter

Wir prüfen: 7 % 4 ist nicht 0 -> weiter

Wir prüfen: 7 % 5 ist nicht 0 -> weiter

Wir prüfen: 7 % 6 ist nicht 0 -> weiter

Schleife durchgelaufen, kein Teiler gefunden, 7 ist eine Primzahl.

Erkennst du, wo der Zähler der Schleife zum Einsatz kommt?

Bin aber schon guten Mutes zu hören, das ich doch schon weiter gekommen bin :D

Nur nicht aufgeben. Und ganz wichtig: Denken ist besser als Rumprobieren. :mod:

Vielleicht wäre ein PAP oder Struktogramm doch nicht so verkehrt. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube ich hatte gerade einen Gedankenblitz!!! :eek:

Kann es denn dann sein, das es dann heißt:

	if(eingabe % 2 == 0)

?

Oder war das nur ein Irrtuhm? Falls es doch Richtig ist, was kommt denn dann für eine Anweisung in die {}???

Kann es eventuell sein, das dann nur noch die cout´s kommen???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube ich hatte gerade einen Gedankenblitz!!! :eek:

Kann es denn dann sein, das es dann heißt:

	if(eingabe % 2 == 0)

?

Nur für den ersten Schleifendurchlauf. Für den nächsten muss da 3 stehen, dann 4 usw.

Der Zähler ändert sich doch bei jedem Durchlauf der Schleife. Und welcher Teil ändert sich in den Beispielen von Zeile zu Zeile?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...