mein primzahlprogramm will keine großen zahlen :/



  • also hier (nochmal) der code

    #include <iostream> 
    #include <math.h>
    
    using namespace std;
    int findPrim(double at, double n)
    {
    	return n==2?
    			2:n<2?
    				-1:at>sqrt(n)?
    					0:n-(floor(n/at)*at)==0?
    						at:findPrim(at+1, n);
    }
    int main()
    {
    	double pPrim;
    	int res;
    	while(true)
    	{
    		std::cout << "Enter Number" << endl;
    		std::cin.clear();
    		std::cin.ignore(std::cin.rdbuf()->in_avail());
    		std::cin >> pPrim;
    		if(!std::cin.fail())
    		{
    			res = findPrim(2, pPrim);
    			if(res == -1)
    				cout << pPrim << " is not a prime" << endl;
    			else if(res == 0)
    				cout << pPrim << " is a prime" << endl;
    			else
    				cout << pPrim << " is not a prime, it can be devided by "<< res << endl;
    		}
    		else
    		{
    			cout << "invalid input!" << endl;
    		}
    
    	}
    	return 0;
    }
    

    Enter Number
    54765675677
    5.47657e+010 is not a prime, it can be devided by 19
    Enter Number
    23434545649898983453457
    2.34345e+022 is not a prime, it can be devided by 2 //warum?????
    Enter Number
    234357
    234357 is not a prime, it can be devided by 3
    Enter Number
    3453457
    3.45346e+006 is not a prime, it can be devided by 7
    Enter Number
    12313487
    1.23135e+007 is not a prime, it can be devided by 23
    Enter Number
    3423569
    3.42357e+006 is a prime
    Enter Number



  • Primzahlberechnung mit Fliesskommazahlen? Das kann doch gar nicht klappen!



  • double hat nur begrenzte Genauigkeit (afair 8..10 Stellen) - wenn du die überschreitest, werden die Werte auf die nächste darstellbare Zahl gerundet. Wenn du Ganzzahlarithmetik jenseits der Grenzen von long benötigst, brauchst du eine Spezialbiliothek (z.B. GMP).



  • Liegt wohl an dem Genauigkeitsverlust bei Fließkommazahlen.

    Wenn du wirklich derart große Zahlen auf ihre Teilbarkeit testen willst kannst du dir vll mal GMP ansehen

    EDIT://
    CStoll war schneller 😉



  • 2.34345e+022 is not a prime, it can be devided by 2 //warum?????

    weil die zahl gerade ist 😉



  • oh man ^^

    ok danke

    pffff auf der gmp seite wird im manual nicht mal die benutzung(installation) unter windows ERWÄHNT oO

    toll...ich hab ka wie ich so eine bibliothek compile und dann einbinde 😕



  • Sieh dir doch mal das hier an.
    http://www.shoup.net/ntl/
    Das geht zumindest einfacher unter Windows.


Anmelden zum Antworten