Ist die Zahl x integer oder double?



  • FreakY<3Cpp schrieb:

    Bei deinem Code scheint nämlich jede Zahl eine Primzahl zu sein. 😃

    Außer 0, 1 und 4.
    Naja, das Testprogramm ist schlimm.
    Besser sowas

    int main()
    {
        for(int i=0;i<100;++i)
            if(is_prime(i))
                cout<<i<<' ';
        return 0;
    }
    


  • Hacker schrieb:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    inline bool is_prime(const unsigned n)
    {
    	for(unsigned a=2;a<n;a++)
    		if(!(n%a))// meint if(n%a==0)
    			return false;
    	return true;
    }
    
    int main(void)
    {
    	cout<<"Bitte Zahl eingeben: ";
    	unsigned a;
            cin>>a;
    
    	string res=(is_prime(a))?"Diese Zahl ist eine Primzahl!":
                                     "Nein, diese Zahl ist keine Primzahl.";
    	cout<<res<<endl;
    }
    

    So korrekt 😞 ?

    Ja, fast. 0 und 1 sind keine Primzahlen. Sonst alles gut.



  • Dann so:

    inline bool is_prime(const unsigned n) 
    { 
        short counter=0;
        for(unsigned a=1;a<=n;a++) 
            if(!(n%a)) 
                ++counter;
    
        return counter == 2; 
    }
    

    Edit:

    Wie wärs mit ohne String?

    Geht bei mir gar nicht, wenn ich den ternären Operator einsetze bekomm' ich was zu hören:

    error: invalid operands of types 'const char [5]' and '<unresolved overloaded function type>' to binary 'operator<<'



  • Hacker schrieb:

    Geht bei mir gar nicht, wenn ich den ternären Operator einsetze bekomm' ich was zu hören:

    Ich habe die Klammern um is_prime(a)?"":"k" vergessen.



  • Golfi1812 schrieb:

    Was haltet ihr davon? Es gibt sicherlich auch noch andere Wege, welcher gefällt euch am besten?

    Mfg Golfi1812

    Das ist schonmal (sehr) lang. Kürzer:

    #include "../../../std_lib_facilities.h" 
    #include <conio.h>
    
    bool test(double n){ 
    
        return  !(floor(n) == ceil(n));
    }
    
    int main()
    {
    	bool i;
    	double n, r, t(1);
    	int x = 0;
    
    	cout<<"Die zutestende Zahl:";
    	cin>>n;
    	cout<<endl;
    
    	while(t<=n){
    
    		 r = n/t;
    		 i = test(r);
    
    		 if(i==0)
    			 ++x;
    
    		 ++t;
    	}
    
    	if(x==2)
    		cout<<n<<" ist eine Primzahl!";
    	else
    		cout<<n<<" ist keine Primzahl!";
    
    	getch();
    }
    

    Ich verurteile natürlich neimanden, denn das ist Geschmackssache. Aber so wirds übersichtlicher, finde ich.



  • [Rewind] schrieb:

    Hacker schrieb:

    Geht bei mir gar nicht, wenn ich den ternären Operator einsetze bekomm' ich was zu hören:

    Ich habe die Klammern um is_prime(a)?"":"k" vergessen.

    Dann auch nicht.



  • Hacker schrieb:

    Dann so:

    inline bool is_prime(const unsigned n) 
    { 
        short counter=0;
        for(unsigned a=1;a<=n;a++) 
            if(!(n%a)) 
                ++counter;
    
        return counter == 2; 
    }
    

    Geht.
    Aber es gibt oft noch einen geileren Trick, um so ein paar (hier nur zwei) Ausnahmen abzufangen. ein if vor alles setzen für die Sonderfälle.

    PIs komischer Code von Fehlern bereinigt (Kahlschlag):

    bool is_prime(unsigned n)
    {
        //testet nur die Teiler 5,7, 11,13, 17,19...
        for(unsigned i = 5, delta = 2; i * i <= n; i += delta, delta = 6 - delta)
            if(n%i==0)
                return false;
        return true;
    }
    

    Ausgabe: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 26 27 28 29 31 32 33 34 36 37 38 39 41 42 43 44 46 47 48 51 52 53 54 57 58 59 61 62 64 66 67 68 69 71 72 73 74 76 78 79 81 82 83 86 87 88 89 92 93 94 96 97 99

    Klar, die 2 und 3 als Teiler wurden gar nicht probiert. Einzelbehandlung für diese Ausnahmen kann davorgeschraubt werden.

    bool is_prime(unsigned n)
    {
        if(n%2==0 || n%3==0)
            return false;
        //testet nur die Teiler 5,7, 11,13, 17,19...
        for(unsigned i = 5, delta = 2; i * i <= n; i += delta, delta = 6 - delta)
            if(n%i==0)
                return false;
        return true;
    }
    

    Ausgabe: 1 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

    Schon krass gut. Nur noch Fehler bei 1, 2 und 3

    Noch eine Ausnahmebehandlung davorschrauben.

    bool is_prime(unsigned n)
    {
        if(n<=3)
        {
            static bool nachschau[4]={false,false,true,true};
            return nachschau[n];
        }
        if(n%2==0 || n%3==0)
            return false;
        //testet nur die Teiler 5,7, 11,13, 17,19...
        for(unsigned i = 5, delta = 2; i * i <= n; i += delta, delta = 6 - delta)
            if(n%i==0)
                return false;
        return true;
    }
    

    Ausgabe: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

    Scheint zu stimmen.

    Damit läßt sich Dein

    bool is_prime(const unsigned n)
    {
        for(unsigned a=2;a<n;a++)
            if(!(n%a))// meint if(n%a==0)
                return false;
        return true;
    }
    

    auch prima reparieren.

    bool is_prime(const unsigned n)
    {
        if(n<2)
            return false;
        for(unsigned a=2;a<n;a++)
            if(!(n%a))// meint if(n%a==0)
                return false;
        return true;
    }
    

  • Mod

    Hacker schrieb:

    [Rewind] schrieb:

    Hacker schrieb:

    Geht bei mir gar nicht, wenn ich den ternären Operator einsetze bekomm' ich was zu hören:

    Ich habe die Klammern um is_prime(a)?"":"k" vergessen.

    Dann auch nicht.

    So muss es funktionieren:

    cout << "Die Zahl ist " << (is_prime(a)?"":"k") << "eine Primzahl." <<endl;
    

    Klammern falsch gesetzt gehabt?



  • Hacker schrieb:

    bool test(double n){ 
    
        return  !(floor(n) == ceil(n));
    }
    

    Ich verurteile natürlich neimanden, denn das ist Geschmackssache. Aber so wirds übersichtlicher, finde ich.

    Ich verurteile Dich, übersehen zu haben, daß !(==) eigentlich != ist.

    bool test(double n){ 
    
        return  floor(n) != ceil(n);
    }
    


  • So'n bescheuerter Fehler... das is' mir jetzt peinlich.

    🕶

    @SeppJ: Ja. Hab den Hinweis überflogen und "Ich habe die Klammern um is_prime(a) vergessen." verstanden.


  • Mod

    Dann muss es auch funktionieren.



  • SeppJ schrieb:

    Dann muss es auch funktionieren.

    Was es ja auch tut.


Anmelden zum Antworten