Ist die Zahl x integer oder double?


  • Mod

    Hacker schrieb:

    ⚠ Rechnen mit Fließkommazahlen durch solche Vergleichsoperatoren ist sehr
    gefährlich.

    edit: Vielleicht doch nicht ... im Test klappts

    Was auch kein Wunder ist, denn es ist hier nicht gefährlich. Verstehe wovon du sprichst, bevor du solche Warnungen gibst.



  • Golfi1812 schrieb:

    ich suche nach einer Möglichkeit eine Zahl x zu überprüfen lassen, ob sie eine natürliche zahl (integer) ist. Gibt es dafür eine brauchbare Funktion, oder muss ich dann doch auf die guten alten Token zurückgreifen?

    Kommt drauf an, in welchem Format die zahl vorliegt. Wenn x ein int ist -> klarer Fall. Bei double gibts die verschiedenen genannten Methoden. Wenn die Zahl nur als Zeichenfolge vorliegt, gehts vielleicht noch einfacher (suche nach dem Komma und den nachkommastellen)



  • Danke....Habe jetzt meine kleine Anwendung fertig.

    Sie überprüft,ob die eingegebene Zahl eine Primzahl ist.
    Jetzt wird das alles noch schöner gemacht, Buttons usw..

    Hier ist der Quellcode:

    #include "../../../std_lib_facilities.h" 
    #include "conio.h"
    
    bool test(double n){ 
        if (floor(n) == ceil(n)){ 
            return false; 
        } 
        else{ 
            return true; 
        } 
    
    }
    
    int main()
    {
    	bool i;
    	double n;
    
    	double r;
    	int x = 0;
    
    	double t = 1;
    
    	cout<<"Die zutestende Zahl:";
    	cin>>n;
    	cout<<"\n";
    
    	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();
    }
    

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

    Mfg Golfi1812



  • Das geht sicher einfacher, wenn du mit ganzen Zahlen arbeitest (Teilbarkeit kannst du per Modulo-Operator feststellen). (außerdem: Wenn du bereits einen Faktor gefunden hast, brauchst du nicht weiterzusuchen ;))



  • 1. warum ließt du nicht gleich einen Integer ein?
    2.

    bool isPream(int number){
        for(int t = 2; t < number; ++t){
            if(n%t == 0){
                return false;
            }
        }
        return true;
    }
    


  • #include <iostream>
    
    bool is_prime(unsigned n)
    {
        if (n == 2 || n == 3)
            return true;
    
        if(n < 5)
            return false;
    
        for(unsigned i = 5, delta = 2; i * i <= n; i += delta, delta = 6 - delta)
            if(!(n % i))
                return false;
    
        return true;
    }
    
    int main()
    {
        int mightbeprime;
        std::cin >> mightbeprime;
    
        if(!std::cin)
        {
            std::cout << "Ungueltige Eingabe!\n";
            return 1;
        }
    
        std::cout << mightbeprime << " ist " << is_prime(mightbeprime) + "keine Primzahl!\n";
        return 0;
    }
    


  • @314159265358979
    Hast du deinen Code mal getestet?



  • Nö. Wenns nicht funktioniert, gut so.



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



  • 314159265358979 schrieb:

    Nö. Wenns nicht funktioniert, gut so.

    Genau.
    Ganz nach deinem Motte: Hauptsache mal wieder Scheisse gepostet.



  • Nö, nach dem Motto: Keine Komplettlösungen. 😉
    Motten sind übrigens cool.



  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    inline bool is_prime(const unsigned n)
    {
    	for(unsigned a=2;a<n;a++)
    		if(!(n%a))
    			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 😞 ?



  • Hacker schrieb:

    ...

    Wie wärs mit ohne String?

    int main(void)
    {
    	cout<<"Bitte Zahl eingeben: ";
    	unsigned a;
    	cin>>a;
    
    	cout << "Die Zahl ist " << is_prime(a)?"":"k" << "eine Primzahl." <<endl;
    }
    


  • Wie wärs mit ohne ?: ?



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


Anmelden zum Antworten