tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von sheel
  • 1 Beitrag von sheel
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
542
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Brisingr Brisingr ist offline Mitglied
    Registriert seit
    Dec 2011
    Beiträge
    10
    Hallo, ich bin Anfänger und beschäftige mich seit ein paar Tagen mit C++.

    Ich will ein Programm schreiben, dass von 1-100 und danach von 1-max(Eine Zahl,die man vorher eingeben soll), alle Primzahlen errechnet und ausgibt.

    Ich habe mir gedacht, dass ich erst einmal anfange indem ich ein Programm schreibe, dass mir beantwortet, ob eine Zahl,die ich eingebe, eine Primzahl ist oder nicht, weil das ja eigentlich die Grundlage für mein eigentliches Programm ist.

    Ich habe folgendes geschrieben:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    #include "../../std_lib_facilities.h"
    #include <conio.h>
     
    // Programm,dass ausgibt, ob eingegebene Zahl Primzahl ist oder nicht
     
    int main()
    {
        int zahl; // die überprüft werden soll
        int teiler;
        
     
     
        cout << " Geben sie eine Zahl ein, von der Sie wissen wollen, ob es eine Primzahl ist! \n\n";
        
        while(cin >> zahl)
        {
     
            if(zahl==2) cout <<" \n \n Es ist eine Primzahl \n \n";
                
            else for(teiler=2; teiler<=(zahl-1); ++teiler)
            {
                                            if(zahl%teiler==0)
                                                {
                                                cout <<" \n\n Diese Zahl ist keine Primzahl \n \n" ;
                                                break;
                                                }
     
                                            else if(zahl%teiler!=0)
                                                {
                                                cout <<" \n\n Diese Zahl ist eine Primzahl \n \n";
                                                break;
                                                }
                                            
                                                                                        
                                                
            }
     
        }
     
     
    getch();
     
     
    }

    Nun ist mein Problem, dass mein Programm falsche Aussagen liefert : z.B.: Bei 55 gibt es aus, dass es eine Primzahl sei.

    Kann mir wer helfen? Danke im Voraus

    || Eigentlich müsste man irgendwie schreiben, dass nur wenn alle Zahlen von 2 bis n-1 keine Teiler von der eingegebenen Zahl sind, eine Primzahl vorliegt. Weiß aber nicht wie (;
    (denn das Programm würde z.B. rechnen 55:3 --> hat keinen Rest von 0 --> gibt aus, dass es eine Primzahl ist)
    Geändert von Brisingr (30.12.11 um 00:49 Uhr)
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi und Willkommen bei tutorials.de,

    In der Schleife gibst du ja schon beim ersten Durchgang aus, ob es eine Primzahl ist,
    und beendest die Schleife dann mit break.

    In der Schleife prüfst du auf Prim/nicht Prim, gibst aber nichts aus.
    Wenns keine Primzahl ist, machst du ein break, sonst nicht.

    Nach der Schleife überprüfst du, ob die Zählvariable ==zahl ist.
    Wenn ja, ist die Schleife komplett ohne break durchgelaufen, also Primzahl.
    Sonst nicht.

    Guliä waíse medh ono
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Noch etwas Wichtiges: Ein logisches Und ist in C++ ein &&! Wenn du nur ein & machst, ist das ein binärer Operator, der macht etwas anderes.

    Und ich vermute, dass ein kleiner Fehler in der Denkweise vorliegt: if (zahl && teiler != 0). Ich schätze einmal, du willst prüfen, ob die Zahl nicht 0 ist und ob der Teiler nicht 0 ist. Dann müsstest du nämlich schreiben: if (zahl != 0 && teiler != 0).
    Wenn zahl und teiler != 0 hat eine andere Bedeutung (in deinem Fall würde es stimmen, aber ich vermute trotzdem, dass du da einen falschen Gedankengang hast) -> Wenn zahl != 0 und teiler != 0.
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Das war wohl ein Tippfehler (% soll hin)
    Aber ein einfaches else reicht auch...
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    Brisingr Brisingr ist offline Mitglied
    Registriert seit
    Dec 2011
    Beiträge
    10
    Danke erstmal für die schnellen Antworten (;
    Ja, das & war nen Tipfehler von mir , da sollte eigentlich % für Rest stehen, habs geändert

    Weiß nicht, ob ich das jetzt richtig verstanden habe, habe das jetzt so geändert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    #include "../../std_lib_facilities.h"
    #include <conio.h>
     
    // Programm,dass ausgibt, ob eingegebene Zahl Primzahl ist oder nicht
     
    int main()
    {
        int zahl; // die überprüft werden soll
        int teiler;
        
     
     
        cout << " Geben sie eine Zahl ein, von der Sie wissen wollen, ob es eine Primzahl ist! \n\n";
        
        while(cin >> zahl)
        {
     
            if(zahl==2) cout <<" \n \n Es ist eine Primzahl \n \n";
                
            for(teiler=2; teiler<=(zahl-1); ++teiler)
                {
                                            if(zahl%teiler==0)                                      
                                            {
                                                cout <<" \n\n Diese Zahl ist keine Primzahl \n \n" ;
                                                break;
                                            }
                                            else cout <<" \n\n Diese Zahl ist eine Primzahl \n\n"; //break entfernt
     
                                            
                                            
                                                                                        
                                                
                }
            
        }
     
     
    getch();
     
     
    }

    Aber wenn ich jetzt z.B. 55 eingebe, gibt es aus : "

    Diese Zahl ist eine Primzahl //weil das Programm bestimmt rechnet 55:2-->nich0--Primzahl

    Diese Zahl ist eine Primzahl //55:3-->nich 0 --> Primzahl

    Diese Zahl ist eine Primzahl // 55:4 --> nich 0 --> Primzahl

    Diese Zahl ist keine Primzahl //und hier merkt es dann dass man es durch 5 teilen kann...
    "

    @sheel
    In der Schleife gibst du ja schon beim ersten Durchgang aus, ob es eine Primzahl ist,
    und beendest die Schleife dann mit break.

    In der Schleife prüfst du auf Prim/nicht Prim, gibst aber nichts aus.
    Wenns keine Primzahl ist, machst du ein break, sonst nicht.

    Nach der Schleife überprüfst du, ob die Zählvariable ==zahl ist.
    Wenn ja, ist die Schleife komplett ohne break durchgelaufen, also Primzahl.
    Sonst nicht.
    Kannst du bitte dazu nen Quellcode einfügen?
    Danke (;
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    for(teiler = 2; teiler <= (zahl - 1); teiler++)
    {
        if((zahl % teiler) == 0)
            break;
    }
    if(teiler >= zahl) //Wenn die Schliefe bis zum Ende durchgelaufen ist, ohne break
    {
        //Primzahl
    }
    else
    {
        //Keine Primzahl
    }
    So ist das gemeint.

    Noch was:
    Die Schleife muss nicht bis <=zahl-1 durchgehen, sondern nur bis zur Wurzel +1
    (int)sqrt(zahl) + 1

    Warum Wurzel?
    zB. 100 ist durch 2, 4, 5, 10, 20, 25 und 50 teilbar
    Wenn man bis inkl. 10 prüft, reicht das, weil:
    Wenns durch 20 teilbar ist, ist 100 ja auch schon durch 5 teilbar, und stoppt schon da.
    Gleich mit 25/4 und 50/2

    (int) und +1 wegen der Kommastellenabschneidung.

    Gruß
    Brisingr bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  7. #7
    Brisingr Brisingr ist offline Mitglied
    Registriert seit
    Dec 2011
    Beiträge
    10
    Ok, also das hab ich verstanden und funktioniert auch alles gut
    Hinterher frag ich mich, warum ich nich selbst drauf gekomm bin (;

    Hab jetzt probiert, dass so um zu schreiben, dass das Programm alle Zahlen von 1-100 testen und diese dann ausgeben soll.

    Hab mir überlegt, dass ich dafür nen Vektor angelege, dann ne Variable Zahl, die immer um 1 erhöht wird, diese wird dann per Rest-Operation überprüft obs ne Primzahl ist, wenn ja wirds zum Vektor hinzugefügt und dann sollte halt die Zahlen, die im Vektor sind ausgegeben werden.

    So hab ich das dann auch probiert, klappt aber nicht so wie's soll (;

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    #include "../../std_lib_facilities.h"
    #include <conio.h>
     
    // Programm,dass alle Primzahlen von 1-100 ausgibt
     
     
    int main()
    {
        int zahl; // die überprüft werden soll
        int teiler;
        vector<int>prime;
        prime.push_back(2);
        int i;
        int size;
            
            
            for(zahl=1; zahl <=100; zahl++)
                {
                    for(teiler = 2; teiler <=(zahl-1); teiler++)
                    {
                    if((zahl % teiler) == 0)
                    break;
                    }
            }
        if(teiler >= zahl)
        {
        prime.push_back(zahl);
        }
     
        size += prime.size();
     
        for(i=0; i<size; i++)
        cout<<prime[i]'\n'<<
        
    }
     
     
    keep_window_open();
     
    }

    Könnt ihr mir da noch helfen/sagen was ich falsch gemacht hab bzw. sagen was ich verändern muss damit es funktioniert? (;
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    size steht zuerst auf irgendwas Unbekanntem, und dann addierst du prime.size() dazu.
    Ergebnis: Irgendein Wert, aber nicht prime.size()
    = nicht +=

    Wurzel beißt nicht
    Brisingr bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  9. #9
    Brisingr Brisingr ist offline Mitglied
    Registriert seit
    Dec 2011
    Beiträge
    10
    Ich wollte erst mal, dass das Programm so funktioniert und dann kann ich ja immer noch das mit der Wurzel ändern, da es ja nicht funktionswichtig ist

    Ok habe das jetzt geändert , lag aber nicht nur daran, sondern auch dass ich ne Klammer falsch gesetzt hatte (;

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    #include "../../std_lib_facilities.h"
    #include <conio.h>
     
    // Programm,dass alle Primzahlen von 1-100 ausgibt
     
     
    int main()
    {
        int zahl; // die überprüft werden soll
        int teiler;
        vector<int>prime;
        prime.push_back(2);
        int i;
        int size;
            
            
            for(zahl=3; zahl <=100; zahl++)
                {
                    for(teiler = 2; teiler <=(zahl-1); teiler++)
                    {
                    if((zahl % teiler) == 0)
                    break;
                    }
            
        if(teiler >= zahl)
        {
        prime.push_back(zahl);
        }
    }
        size = prime.size();
     
        for(i=0; i<size; i++)
        cout<<prime[i]<<'\n';
     
    getch();
        
    }

    so funktionierts
     

  10. #10
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Nur mal so nebenbei, wie man Primzahlen-Faktorisierung tunen kann: Überlege dir, was die Definition einer Primzahl ist. Eine Primzahl lässt sich nur durch sich selbst oder 1 ohne Rest teilen. Das bedeutet, das man "nur" probieren muss, ob eine Zahl n durch eine vorherige ermittelte Primzahl ohne Rest teilbar ist.

    Zahlentheorie, ich liebe es...
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

Ähnliche Themen

  1. Primzahlen ermitteln
    Von Mindxxxd im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 20.11.11, 23:37
  2. Antworten: 4
    Letzter Beitrag: 13.11.10, 20:06
  3. Primzahlen mit Programm ermitteln
    Von Bertelcraft im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 20.10.08, 08:28
  4. Problem bei einem Programm mit Primzahlen
    Von Beathoven im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 02.01.08, 15:54
  5. Primzahlen ermitteln
    Von cotrhox im Forum PHP
    Antworten: 1
    Letzter Beitrag: 22.02.05, 17:06