potenz in for-schleife



  • ich hab mal ne frage und zwar möchte ich eine for-schleife machen, in der der zähler erst potenziert und dann erst verglichen wird.

    for (loop = 1; 2^loop <= n-1; ++loop)

    ich weiß, dass ich es nicht mit ^ machen kann.

    wenn ich es pow kommt immer die fehlermeldung, dass die überladene funktion nicht eindeutig ist.

    wie kann ich also das am besten mit pow machen ?

    gruß gucky



  • mach ihm klatr welche du willst:

    double pow (      double base,      double exponent );
    long double pow ( long double base, long double exponent );
          float pow (       float base,       float exponent );
         double pow (      double base,         int exponent );
    long double pow ( long double base,         int exponent );
    

    Abgesehen davon finde ich es mehr als fragwürdig was du da vorhast ...

    ausserdem könntest du auch ausnutzen das 2^irgendwas sowas ähnliches ist wie 1 geshiftet ...
    oder wenn n sich in der Schleife nicht ändert vielleicht das einfach sqrt'ieren ...



  • pow(static_cast<double>(loop)...



  • <<



  • ich versuche mich grade im miller rabin primzahltest und da braucht man meiner ansicht nach so eine schleife



  • jetzt kommt die fehlermeldung : 'pow': Funktionsdeklaration steht in Konflikt mit dem Bezeichner 'pow', der durch eine using-Deklaration definiert wurde


  • Mod

    Gucky schrieb:

    jetzt kommt die fehlermeldung : 'pow': Funktionsdeklaration steht in Konflikt mit dem Bezeichner 'pow', der durch eine using-Deklaration definiert wurde

    Heißt das, du hast dir eine eigene Potenzfunktion geschrieben?* Dann vermeide den namenskonflikt, indem du entweder std::pow nicht in den globalen Namensbereich zerrst, deine eigene Funktion in einen anderen Namensbereich steckst oder sie schlicht und einfach anders benennst.

    *: Wenn Nachfragen von Leuten kommen die dir helfen wollen ist das ein schlechtes Zeichen. Die Helfer spekulieren nur. Und wenn sich diese Spekulationen als falsch herausstellen ist das für die Helfer sehr frustrierend, weil die Mühe umsonst war. Und Schuld daran bist du, weil du dein Problem nur unzureichend beschreibst.



  • da ich es nicht ganz verstehe was du meinst, hier min quelltext:

    #include <iostream>
    #include <cmath>
    #include <string>
    using namespace std;
    
    int main()
    {
      int S,  n, v, loop;
      double pow (double base,int exponent );
      double e = 2;
    
      cout << "Zu testende Primzahl : ";
      cin >> n;
    
      if (n % 2 != 0)
      {
    
    	for (loop = 1; pow(e,loop) <= (n - 1); ++loop)
    	{
    		if (((n - 1) % 2^loop) == 0)
    		{
    			S = loop;
    		}
    	}
    
    	cout << S << endl;
      }
    
      return 0;
    }
    


  • Was soll Zeile 9 genau?! 😮
    Mach das mal weg!


  • Mod

    double pow (double base,int exponent );
    

    Was bitte soll das sein? Ich glaube du hast padreighs Ratschlag gänzlich missverstanden.



  • ist mir grad auch aufgefallen



  • so jetzt geht anscheinend fast alles:

    #include <iostream>
    #include <cmath>
    #include <string>
    using namespace std;
    
    int main()
    {
      int S, v, loop = 1, n;
      double e = 2, z ;
    
      cout << "Zu testende Primzahl : ";
      cin >> n;
    
      if (n % 2 != 0)
      {
    
    	for (loop = 1; pow(e,loop) <= (n - 1); ++loop)
    	{
    		if (((n - 1) % pow(e,loop)) == 0)
    		{
    			S = loop;
    		}
    	}
    
    	cout << S << endl;
      }
    
      return 0;
    }
    

    nur wie kann ich jetzt mein modulo operator anwenden, da einmal ein typ integer und einmal double ist?


  • Mod

    fmod oder casten.



  • ok, danke jetzt klappt alles 🙂



  • In so einem Algorithmus mit Fließkommazahlen zu hantieren, wäre mit ehrlich gesagt zu riskant. Warum nutzt Du nicht einfach den Shift-Operator?



  • ok ich hab noch nie so etwas mit einem shift operator gemacht, aber wo sollte ich ihn nutzen??


  • Mod

    Gucky schrieb:

    ok ich hab noch nie so etwas mit einem shift operator gemacht, aber wo sollte ich ihn nutzen??

    2 hoch x ist das gleiche wie 1<<x



  • Natürlich könnte man sich auch einen Bit-Twiddling Hack zum Zählen der Null-Bits am LSB-Ende der Zahl raussuchen.


Anmelden zum Antworten