Zum Inhalt springen

Primzahlen


IltisvdT

Empfohlene Beiträge

Hallo,

ich soll ein Programm schreiben, dass die Primzahlen zwischen zwei Grenzen ausgibt. Ich habe folgenden Code:

#include <stdio.h>

int main (){

int zahla, zahlb, hilfa, hilfb, a=2,b;

printf("Untere Grenze?:");

scanf("%d",&zahla);

printf("Obere Grenze?:");

scanf("%d",&zahlb);

hilfa=zahla;

hilfb=zahlb;

for(hilfa<hilfb;hilfa<hilfb;hilfa++){

for(a=2;a<=(hilfa-1);a++){

b=hilfa%a;

switch(B){

case 0:

break;

default: {

printf("%d\n",hilfa);

break;}

}}

a=2;}

return(0);

}

Die hilfa und hilfb hab ich eingebaut, weil ich dachte, ich bräuchte die Grenzen vielleicht nochmal.

Er kompiliert das Programm auch, stürzt dann aber ab ohne eine einzige Zahl zu berechnen. Schreiben müssen wir in C.

Vielen Dank schoneinmal

Link zu diesem Kommentar
Auf anderen Seiten teilen

#include <stdio.h>

int main (){

int zahla, zahlb, hilfa, hilfb, a=2,b;

printf("Untere Grenze?:");

scanf("%d",&zahla);

printf("Obere Grenze?:");

scanf("%d",&zahlb);

hilfa=zahla;

hilfb=zahlb;

for(hilfa<hilfb;hilfa<hilfb;hilfa++){

for(a=2;a<=(hilfa-1);a++){

b=hilfa%a;

switch(B){

case 0:

break;

default: {

printf("%d\n",hilfa);

break;}

}}

a=2;}

return(0);

}

Es wäre außerdem super, wenn du deinen Code ein wenig ansprechender präsentieren könntest, da ich so z.B. überhaupt keinen Bock habe, mich da durch zu kämpfen.

Gehört auch zur höflichen Fragestellung, den Beitrag leserlich abzugeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Auch wenn ich jetzt Augenkrebs bekomme ;)

Hast du überhaupt eine Ahnung von For-Schleifen ???


for(hilfa<hilfb;hilfa<hilfb;hilfa++)

{...}

Die Initialisierung hilfa<hilfb macht keinen Sinn !!! Du willst doch da nichts vergleichen, sondern einen Startwert für hilfa zuweisen (was durch die Anwenderabfrage ja eigentlich schon erledigt ist).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Entschuldigt bitte die schlechte Darstellung. Ich habe das ausm Editor kopiert, da sahs gut aus(also mit tabs usw) und dann hab ich auf Beitrag erstellen geklickt und dann sah es so aus. Nächstes mal werde ich darauf achten.

@Korhil:

Wie du sagst soll ja einfach nur die for-Schleife losgehen. Was liegt da näher als ein bedingung zu nehmen, die immer erfüllt is? Und das ist diese ja, dadurch, dass die untere Grenze idR immer kliener ist als die obere. natürlich gibt es schönere Möglichkeiten, aber hauptsache es funktioniert?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei mir stürzt es nicht ab.

Du solltest allerdings bedenken, dass es für eine Primzahl nicht ausreicht, wenn du eine einzige Zahl findest, die kein Teiler ist. Genau dann machst du aber schon die Ausgabe.

Könnte man es also vielleicht so machen, das man das Produkt aller Reste nimmt? Wenn das ungleich 0 ist, müsste es ja ein Primzahl sein, oder? Dann müsste ichs mit float machen, richtig? oder geht das insgesamt noch einfacher?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Entschuldigt bitte die schlechte Darstellung. Ich habe das ausm Editor kopiert, da sahs gut aus(also mit tabs usw) und dann hab ich auf Beitrag erstellen geklickt und dann sah es so aus. Nächstes mal werde ich darauf achten.

@Korhil:

Wie du sagst soll ja einfach nur die for-Schleife losgehen. Was liegt da näher als ein bedingung zu nehmen, die immer erfüllt is? Und das ist diese ja, dadurch, dass die untere Grenze idR immer kliener ist als die obere. natürlich gibt es schönere Möglichkeiten, aber hauptsache es funktioniert?

Schau dir bitte noch mal an, wie eine for-Schleife funktioniert !!!

Ich habe von er Initialisierung und nicht von der Überprüfung der Abbruchbedinung gesprochen:

for ( Initialisierung; Bedingung; Schrittweite )

Link zu diesem Kommentar
Auf anderen Seiten teilen

Könnte man es also vielleicht so machen, das man das Produkt aller Reste nimmt? Wenn das ungleich 0 ist, müsste es ja ein Primzahl sein, oder?
Das ist richtig. Aber eigentlich kannst du die Prüfschleife abbrechen, wenn du einen Teiler findest. Bricht die Schleife vorzeitig ab, ist es keine Primzahl, läuft sie durch, ohne dass ein Teiler gefunden wird, ist es eine.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hoffe mal, dass die Tabs nun richtig angezeigt werden und der Code ansprechend angezeigt wird.

Also wir haben nun eure Tipps soweit wie es geht umgesetzt.

Das Programm funktioniert auch, allerdings zeigt er noch alle Zahlen an, die nicht den Rest 0 haben.. ich habe im Moment nur leider keine Idee wie man dies ändern könnte(auch das Sieb des Erasthotener hilft mir nicht viel weiter). Hättet ihr diesbezüglich vielleicht noch einen Tipp?

Hier der Code:

#include <stdio.h>

int main ()

{

    int zahla, zahlb, a, b;

    printf("Untere Grenze?:");

    scanf("%d",&zahla);

    printf("Obere Grenze?:");

    scanf("%d",&zahlb);

        for(; zahla<zahlb; zahla++)

        {

            for(a=2;a<=(zahla-1);a++)

            {

                b=zahla%a;

                switch(

                {

                    case 0:

                        break;

                    default: 

                    {

                        printf("%d\n", zahla);

                        break;

                    }

                }

            }

        }

return(0);

}[/code]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Programm funktioniert auch, allerdings zeigt er noch alle Zahlen an, die nicht den Rest 0 haben..
Wenn ein Programm nicht tut, was es soll, nennt man das üblicherweise nicht "funktionieren" ;)

Hättet ihr diesbezüglich vielleicht noch einen Tipp?
Wieso noch einen? Setz doch erst mal die Tipps um, die du schon bekommen hast. Wenn du einen Teiler findest, ist es keine Primzahl. Wenn du keinen Teiler findest, ist es eine. Ob du keinen findest, kannst du aber erst wissen, wenn die Schleife komplett durchgelaufen ist. Vorher darfst du also auch keine Ausgabe machen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hoffe mal, dass die Tabs nun richtig angezeigt werden und der Code ansprechend angezeigt wird.

Also wir haben nun eure Tipps soweit wie es geht umgesetzt.

Das Programm funktioniert auch, allerdings zeigt er noch alle Zahlen an, die nicht den Rest 0 haben.. ich habe im Moment nur leider keine Idee wie man dies ändern könnte(auch das Sieb des Erasthotener hilft mir nicht viel weiter). Hättet ihr diesbezüglich vielleicht noch einen Tipp?

Hier der Code:

#include <stdio.h>

int main ()

{

    int zahla, zahlb, a, b;

    printf("Untere Grenze?:");

    scanf("%d",&zahla);

    printf("Obere Grenze?:");

    scanf("%d",&zahlb);

        for(; zahla<zahlb; zahla++)

        {

            for(a=2;a<=(zahla-1);a++)

            {

                b=zahla%a;

                switch(

                {

                    case 0:

                        break;

                    default: 

                    {

                        printf("%d\n", zahla);

                        break;

                    }

                }

            }

        }

return(0);

}[/code]

Führe noch eine Variable vom Typ boolean ein, die sich merkt, ob ein Teiler gefunden wurde (in deinem switch-case[wobei man soetwas eigentlich nur dann nimmt, wenn mehr als zwei Möglichkeiten vorhanden sind]). Beachte dabei, das für jede neue Zahl die Variable erst einmal wieder auf false gesetzt werden muss.

Nach der Schleife überprüfst du, ob sie noch den Wert false hat, dann darfst du die Zahl ausgeben, sonst nicht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab es nun hinbekommen, dass nur Primzahlen ausgespuckt werden:)

Vielen Dank für die Tipps!

Der Vollständigkeit halber hier einfach noch der Code:

#include <stdio.h>

int main ()

{

    int zahla, zahlb, a, b, prim;

    printf("Untere Grenze?:");

    scanf("%d",&zahla);

    printf("Obere Grenze?:");

    scanf("%d",&zahlb);

        for(; zahla<zahlb; zahla++)

        {

            prim=0;

            for(a=2;a<=(zahla-1);a++)

            {

                b=zahla%a;

                if(b==0)

                    prim=1;

            }

            if(prim==0)

                printf("%d\n", zahla);

        }

return(0);

}

Geht sicherlich eleganter aber wir sind zufrieden solange es funktioniert;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Und wenn du jetzt noch nicht die Lust verloren hast, dann könnte man den Code/Algorithmus auf Performance trimmen.

Schlagworte:

- obere Teilergrenze = Wurzel aus Zahl

- ab 3 nur noch ungerade Zahlen testen

- nur Primzahlen als mögliche Teiler verwenden

- ...

Damit kannst du das Programm locker auf 10% der jetzt benötigten Zeit herunter drücken, was sich natürlich nur bei größeren Zahlenbereichen bemerkbar macht für den Anwender.

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