Primzahl mit Ober/untergrenze



  • Hallo, ich weiß das hört sich jetz vielleicht lächerlich/total verblödet an, aber ich kriegs einfach nicht hin. Schon in der letzten Klausur hat mir das total die Note versaut. Zweck des Programms ist, alle Primzahlen zwischen einer vom User festgelegten Ober/untergrenze auszugeben. Allerdings gibt mir das programm einfach alle zahlen von Ober zu Untergrenze aus. Ich raffs einfach nicht, ich mein schaut euch das Programm an, ich kann da absolut keinen Logikfehler entdecken.

    #include <conio.h>
    #include <iostream.h>
    
    //primzahlen mit og/ug
    
    void main ()
    { int og,ug;
    
    cout<<"\nuntergrenze eingeben: "; cin>>ug;
    cout<<"Obergrenze eingeben: "; cin>> og;
    
    for (int i=2;i<=og;i++)
    	{ if (ug%i==0)
    		{ug=ug+1;
          }
          else
           {
            cout<<ug<<"  ";
              ug=ug+1;
           }
    
       }
    
    getch();
    }
    

    Vielleicht sollte man aber auch nicht programmieren wenn man soviel getrunken hat 🤡



  • Vielleicht sollte man aber auch nicht programmieren wenn man soviel getrunken hat 🤡

    Ja.

    1. Beschissene Klammersetzung
    2. Überlegt dir mal, wann ne Zahl ne Primzahl ist und vergleich das mit dem was du machst.



  • Ich würde es etwa so machen:

    ...
    for(unsigned int i = ug; i <= og; i++) {
          if(isPrime(i))
              cout<<ug<<"  ";
    }
    ...
    
    bool isPrime(unsigned int number) {
    
       for(unsigned int i = 2;  static_cast<double>(i) <= sqrt(number); i++) {
    
           if( number%i == 0 ) //Ohne Rest Teilbar
              return true;
    
       }
       return false;
    
    }
    

    ungetestet



  • achja, das hier

    #include<iostream.h>
    

    ist veraltet und sollte so heißen

    #include<iostream>
    


  • Storm.Xapek.de schrieb:

    Ich würde es etwa so machen:

    ...
    for(unsigned int i = ug; i <= og; i++) {
          if(isPrime(i))
              cout<<ug<<"  ";
    }
    ...
    
    bool isPrime(unsigned int number) {
    
       for(unsigned int i = 2;  static_cast<double>(i) <= sqrt(number); i++) {
    
           if( number%i == 0 ) //Ohne Rest Teilbar
              return true;
    
       }
       return false;
    
    }
    

    ungetestet

    Hättest du mal besser, ist nämlich der selbe quatsch wie oben, nur noch mehr Fehler.



  • ...
    for(unsigned int i = ug; i <= og; i++) {
          if(isPrime(i))
              cout<<i<<"  ";
    }
    ...
    
    bool isPrime(unsigned int number) {
    
       for(unsigned int i = 2;  static_cast<double>(i) <= sqrt(number); i++) {
    
           if( number%i == 0 ) //Ohne Rest Teilbar
              return false;
    
       }
       return true;
    
    }
    

    Ach verdammt, so isses richtiger 🤡



  • MegaHyperGigaCoder schrieb:

    Vielleicht sollte man aber auch nicht programmieren wenn man soviel getrunken hat 🤡

    Ja.

    1. Beschissene Klammersetzung
    2. Überlegt dir mal, wann ne Zahl ne Primzahl ist und vergleich das mit dem was du machst.

    1.)schlecht gelaunt? dann antworte nicht. ich hab den code aus meinem programm kopiert und ka warum er hier die klammern so kacke setzt.
    2. Ich mache genau das was nötig ist um festzustellen obs ne primzahl ist, nicht mehr , nicht weniger.

    @Die anderen, danke für die hilfe wollts eigentlich auch erst so machen aber hatte mir dann gedacht das es auch anders gehn muss. naja wurde eines besseren belehrt



  • alc schrieb:

    2. Ich mache genau das was nötig ist um festzustellen obs ne primzahl ist, nicht mehr , nicht weniger.

    Ne, nicht wirklich, was du mit nem Debugger ganz einfach feststellen hättest können, aber dann hättest du ja auch noch selber was machen und denken müssen. 🙄



  • Ein wenig umformen ergibt:

    #include <conio.h>
    #include <iostream.h>
    
    //primzahlen mit og/ug
    
    void main ()
    { 
      int og,ug;
    
      cout<<"\nuntergrenze eingeben: "; cin>>ug;
      cout<<"Obergrenze eingeben: "; cin>> og;
    
      for (int i = 2; i <= og; i++)
      { 
        if (ug % i != 0)
          cout << ug <<"  ";
        ug = ug + 1;
      }
      getch();
    }
    

    Das hier in den meisten Fällen die Zahlen zwischen Obergrenze und Untergrenze ausgespuckt werden ist klar. Der Test, ob eine Zahl zwischen ug und ob eine Primzahl ist, fehlt komplett.

    Ich würde dir empfehlen erst eine Funktion, zum Testen ob eine Zahl eine Primzahl ist, zu schreiben und damit alle Zahlen zwischen ug und og zu testen.



  • Schneller sollte es gehen, wenn du dir die bisherigen Primzahlen merkst:

    std::vector<unsigned> primzahlen;
    primzahlen.push_back (2);
    
    for (unsigned n = 3; n < og; n += 2)
    {
       bool prim = true;
       for (std::vector<unsigned>::const_iterator i = primzahlen.begin (); i != primzahlen.end (); ++i)
           if ((n % *i) == 0)
           {
               prim = false;
               break;
           }
    
       if (prim)
           primzahlen.push_back (n);
    }
    

    Am Ende stehen im Vektor primzahlen alle solchen, die kleiner als die obere Grenze sind. Die untere Grenze kannst du dann bei der Ausgabe beachten.


  • Mod

    Das kann man (völlig sinnfrei) noch mit Standardalgorithmen würzen, dann ist es auch komplex genug, um dem OP nicht zu nützen.

    template<typename T>
    std::vector<T> find_primes(T lower_bound, T upper_bound)
    {
        std::vector<T> primes;
        if ( upper_bound >= 2 )
            primes.push_back( 2 );
    
        typename std::vector<T>::size_type last = 1;
        for ( T n = 3; n <= upper_bound; n += 2 )
        {
            if ( std::find_if( primes.begin() + 1, primes.begin() + last, std::not1( std::bind1st( std::modulus<T>(), n ) ) ) == primes.begin() + last )
               primes.push_back( n );
            if ( ( n + 2 ) / primes[ last ] >= primes[ last ] )
                ++last;
        }
    
        return std::vector<T>( std::lower_bound( primes.begin(), primes.end(), lower_bound ), primes.end() );
    }
    

Log in to reply