mehrdeutiger Aufruf einer überladener Funktion



  • int main(int n)
    

    Das geht nicht. Wenn du wissen willst, was main für Parameter haben kann, googel das mal.

    Ansonsten wird er dir noch sagen, dass sqrt nicht deklariert ist, das ist es nämlich in der Headerdatei cmath.

    Außerdem hast du das ganz schön umständlich gelöst.

    Deine Schleife kannst du auch gleich ganz leicht in eine hübsche Funktion packen.
    Könnte so aussehn.

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    bool ist_primzahl(int zahl)
    {
        if(zahl < 2)
            return false;
        if(zahl == 2)
            return true;
        for(int i = 2; i <= (zahl / 2); ++i)
            if(zahl % i == 0)
                return false;
        return true;
    }
    
    int main()
    {
        int n;
        cout << "Geben Sie eine Zahl ein:\n";
        cin >> n;
        if(ist_primzahl(n))
            std::cout << "Primzahl!\n";
        else
            std::cout << "Keine Primzahl!\n";
        return 0;
    }
    


  • Wenn ich das Programm so kopiere sagt es mir 121 ist prim

    Irgendwas stimmt doch hier mit meinem Programm nicht.
    Und anstatt bis n/2 reicht es ja bis sqrt(n)+1 zu gehen.

    Wieso klappt das bei mir nicht?



  • Du musst schon den Quellcode zeigen, der nicht funktioniert...



  • So siehts jetzt aus:
    Ich habe den Verdacht, dass lediglich auf modulo 2 und 3 getestet wird. Zahlen wie 25,121 sind prim, Zahlen die gerade oder durch 3 teilbar sind werden als nicht prim ausgegeben.

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    bool ist_primzahl(int zahl)
    {
        if(zahl < 2)
    	{
    		return false
    	}
    	if (zahl==3)
    	{
    		return true
    	}
    	if(zahl % 2 ==0)
    	{
    		return false
    	}
    	for(unsigned int i=3,i<=(sqrt(zahl)+1),i+=2)
    	{
    		if(zahl % i ==0)
    		{
    			return false
    		}
    	}
    	return true;
    }
    
    int main()
    {
        int n;
        cout << "Geben Sie eine Zahl ein:\n";
        cin >> n;
        if(ist_primzahl(n))
            cout << "Primzahl!\n";
        else
            cout << "Keine Primzahl!\n";
        return 0;
    }
    

  • Mod

    ray91 schrieb:

    So siehts jetzt aus:

    Da schon mehr als einmal auf C&P hingewiesen wurde, gehe ich mal davon aus, dass das ein Trollversuch sein soll.



  • Der Code steht doch da



  • Mein "fertiges" Programm sieht jetzt so aus: (Es ist C&P)

    #include "StdAfx.h"
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    bool IstPrimzahl(int zahl)
    {
        int i;
    	if(zahl<2)
    		return false;
    	if(zahl==3)
    		return true;
    
            for(i=3; i<=sqrt(static_cast<double>(zahl)); i+=2)
            {
                if ( zahl % i == 0 )
                {
                return false;
                }
            }
    
        return true;
    } 
    
    int main()
    {
        int n;
        cout << "Geben Sie eine Zahl ein:\n";
        cin >> n;
        if(IstPrimzahl(n))
            cout << "Primzahl!\n";
        else
            cout << "Keine Primzahl!\n";
    	system("Pause");
        return 0;
    }
    

    Für kleine Zahlen macht es alles richtig.

    Wenn ich aber jetzt größere Zahlen benutze, wie zum Beispiel 2^4423-1, sagt mir das Programm immer "keine Primzahl", was wohl an der Größe der Zahl liegt. Welche Library brauche ich denn jetzt für solche großen Zahlen?
    Habe mit google nichts gefunden.
    Links in anderen Foren sind meistens auf Seiten verlinkt, die nicht mehr existieren..



  • GNU MP, zum Bleistift.


  • Mod

    2^4423 kannst du mit deinem Algorithmus sowieso vergessen. Da würden alle Computer der Welt zusammen, selbst die, die noch in Zukunft gebaut werden, so lange dran Rechnen, dass man da tatsächlich mal das Wort "ewig" benutzen darf.
    Auch wird dir GNU MP da herzlich wenig nutzen. Wieder: Alle Computer der Welt, selbst die, die noch nicht gebaut wurden, zusammen, können diese Zahl nicht genau speichern.

    Du brauchst einen Primzahltest wie z.B. Miller-Rabin.


  • Mod

    SeppJ schrieb:

    2^4423
    [...]
    Alle Computer der Welt, selbst die, die noch nicht gebaut wurden, zusammen, können diese Zahl nicht genau speichern.

    Ich glaube, mein Computer verfügt über mehr als 4423 bit Speicherkapazität...



  • Im Endeffekt läuft das ganze auf den AKS Primzahltest hinaus, aber dort brauch ich auch eine Library für große Zahlen. Diese Zahl habe ich nur mal eingesetzt um zu schauen was passiert, aber es funktionierte ja leider nicht, da mir die library fehlte.

    Danke für die Antwort


  • Mod

    camper schrieb:

    Ich glaube, mein Computer verfügt über mehr als 4423 bit Speicherkapazität...

    Ups, ja. Ein bisschen verschätzt. 😃



  • SeppJ schrieb:

    Ups, ja. Ein bisschen verschätzt. 😃

    Nur ganz leicht. Nicht jeder Computer hat so enorm viel Speicher 🤡



  • SeppJ schrieb:

    Auch wird dir GNU MP da herzlich wenig nutzen.

    👍 🤡 ... 😃


Anmelden zum Antworten