Zum Inhalt springen

Problem mit Anfängerprogramm


Kain91

Empfohlene Beiträge

Hallo,ich bin noch ziemlich unerfahren was Informatik angeht und habe diese Aufgaben vorgelegt bekommen:

Schreiben sie ein Programm, dass eine vom Benutzer bestimmte Anzahl an Primzahlen ausgibt. So ... ich bin darauf zu diesemErgebnis gekommen, nur leider funktioniert es nicht.

Erkennt vielleicht jemand den Fehler ?

#include <stdio.h>


int main(int argc, char* argv[])


{

int zahl=2;

int counter;

int i=0;

int isprim=1;

int length;


printf ("Bitte geben sie die Anzahl der Primzahlen ein:");

scanf ("%d", length);


for (zahl=2; i<=length; zahl++)

{

	isprim=1;

	for (counter=2 ;counter<zahl; counter++)

		{

			if (zahl%counter==0)

				isprim=0;	

		}

if(isprim==1)

	{

	printf ("Die Zahl %d ist eine Primzahl\n",zahl);

	counter=2;

	i++;

	}

}		



return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

1. mal verwendest du i und mal zahl in der ersten for schleife.

2. counter zurücksetzen ist nicht notwendig

3. i zu inkrementieren ist auch nicht nötig (selbst wenn es zahl wäre, da dies schon in der schleife geschieht

ansonsten sollte der algorithmus funktionieren


#include <stdio.h>


int main(int argc, char* argv[])


{

int zahl=2;

int counter;

int i=0;

int isprim=1;

int length;


printf ("Bitte geben sie die Anzahl der Primzahlen ein:");

scanf ("%d", length);


for (zahl=2; [B]zahl[/B]<=length; zahl++)

{

	isprim=1;

	for (counter=2 ;counter<zahl; counter++)

		{

			if (zahl%counter==0)

				isprim=0;	

		}

if(isprim==1)

	{

	printf ("Die Zahl %d ist eine Primzahl\n",zahl);

	[B]//[/B]counter=2;

	[B]//[/B]i++;

	}

}		



return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die schnelles Antworten, also jetzt schmiert mir mein Compiler ab wenn ich den code kompilieren will.

Seh ich das richtig dass ich die Variable i also gar nicht brauche?

Aber ohne i zählt ja keine Variable mit, wieviele Primzahlen gefunden worden sind.

Bearbeitet von Kain91
Link zu diesem Kommentar
Auf anderen Seiten teilen

achso ja dafür war i gut.


#include <stdio.h>


int main(int argc, char* argv[])


{

int zahl;

int counter;

int i;

int isprim=1;

int length;


printf ("Bitte geben sie die Anzahl der Primzahlen ein:");

scanf ("%d", length);


for (i=0, zahl=2; i<length;zahl++)

{

	isprim=1;

	for (counter=2 ;counter<zahl; counter++)

		{

			if (zahl%counter==0) {isprim=0;[B]break;[/B]}

		}

if(isprim==1)

	{

	printf ("Die Zahl %d ist eine Primzahl\n",zahl);

	//counter=2;

	i++;

	}

}		



return 0;

}

Das break verhindert das noch unnötig die Schleife durchlaufen wird obwohl schon klar ist, dass die Zahl keine Primzahl ist

Der Compiler "schmiert ab"? Also stürzt ab oder bringt er einen Fehler?

Bearbeitet von Leimy84
Link zu diesem Kommentar
Auf anderen Seiten teilen

Also mit Booleantyp meinste char ?

Boolean data type - Wikipedia, the free encyclopedia

Char (Datentyp)

Die Schleifen sind falsch. Der Algorithmus den Du zu implementieren versuchst ist das Sieb des Eratosthenes, d.h.

Man beginnt mit 2, dann entfernt man alle Zahlen die ein Vielfaches von 2 sind, dann inkrementiert man die 2 zu 3, entfernt alle Vielfachen von 3, dann inkrementiert man 3 zu 4, da 4 ein Vielfaches von 2 ist, wird es direkt übersprungen und wieder inkrementiert zu 5.

Dein Algorithmus wird in dieser Form nicht funktionieren ! Es ist durchaus hilfreich, wenn Du Dir den Wikipediaartikel anschauen würdest

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst erst am Ende des Algorithmus, d.h. wenn alle Zahlen in Deinem Intervall geprüft wurden entscheiden, ob eine Zahl prim ist oder nicht. Während der Iterationen kannst Du höchstens entscheiden, dass eine Zahl kein Vielfaches von einer anderen ist bzw. kein Vielfaches von einer Zahl von 2 bis n (n aktuelle Zahl). Die Definition einer Primzahl ist, dass sie nur durch 1 und nur durch sich selbst ohne Rest teilbar ist, d.h. wenn Du entscheiden willst, ob eine Zahl prim ist, dann musst Du _alle_ Zahlen von 2 bis n-1 prüfen, ob n durch eine dieser teilbar ist (verkürzt gesagt), daraus folgt aber dass das "alle" der wichtigste Punkt ist, in Deiner bisherigen Lösung betrachtest Du nur eine Restklasse (Kongruenz (Zahlentheorie))

Die Aussage, dass man dazu ein Feld braucht, ist nicht ganz korrekt. Man braucht nicht zwingend ein Feld, man kann das auch etwas dynamischer gestalten. Vor allem lohnt es sich, den Algorithmus von Eratosthenes etwas zu modifizieren, dass man schon während der Iteration der äußeren Schleife sagen kann, ob Primzahlen vorliegen, denn wenn man das Intervall [2, k) und [k,n] betrachtet, dann kann immer aussagen, welche Zahlen im Intervall [2,k) prim sind, d.h. man kennt alle Primzahlen bis zur aktuellen Position.

Bearbeitet von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

So jetzt stürzt er nicht mehr ab aber ich hab das gleiche Problem wie zu Anfang. Der Zählt einfach zahl+=zahl hie rmal n Bild:

Directupload.net - Ddvzqa2cq.png

Was ist denn an dem Bild falsch? Das sind Primzahlen! Aber was hast du denn als Primzahlmenge eingeben wenn ich fragen darf. Also ich hab mal 15000 angegeben und kam nicht so hoch.

@flashpixx: Die Verwendung eines anderen Algorithmusses ist sicherlich nicht verkehrt, aber für einen Programmieranfänger nicht realisierbar. Es geht in diesem Thread doch auch nicht darum, das Ganze zu optimieren, sondern es einfach nur zu lösen. Die im ersten Post angewandte Technik ist absolut in Ordnung. Ich bin mir auch grade nicht so sicher, warum der TE daran zweifelt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habs jetzt auchmal in c umgesetzt und dann wurde mir klar was falsch war:


scanf ("%d", &length);

scanf erfordert die Übergabe eines Zeigers. Jetzt nur noch das <= durch ein < ersetzten und alles läuft:

for (zahl=2; i<length; zahl++)

Bearbeitet von Leimy84
Link zu diesem Kommentar
Auf anderen Seiten teilen

Einmal eine C++ Variante auf die schnelle codiert:


#include <cstdlib>

#include <iostream>

#include <vector>


int main(int argc, char* argv[])

{

    std::size_t l_max = 0;


    std::cout << "Zahl eingeben (Maximum) : ";

    std::cin >> l_max;

    std::cout << std::endl;


    std::vector<std::size_t> l_prims;

    for(std::size_t i=2; i <= l_max; ++i)

        l_prims.push_back(i);



    for(std::size_t n=0; n < l_prims.size(); ++n)

        for(std::size_t i=n+1; i < l_prims.size(); ++i)

            if (!(l_prims[i] % l_prims[n]))

                l_prims.erase(l_prims.begin()+i);



    std::cout << "Primzahlen von [0," << l_max << "] : ";

    for(std::size_t i=0; i < l_prims.size(); ++i)

        std::cout << l_prims[i] << " ";

    std::cout << std::endl;   


    return EXIT_SUCCESS;

}

Der Algorithmus ist immer noch der gleiche, letztendlich ist nur die Struktur invertiert.

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...