Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Primzahlen

Empfohlene Antworten

Veröffentlicht

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

Er kompiliert das Programm auch, stürzt dann aber ab ohne eine einzige Zahl zu berechnen.
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.

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

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

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?

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?

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 )

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.

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]

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

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;)

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.