Testen ob eine Zahl Quadratzahl ist.



  • Ich habe ein Kleines Progrämmchen, welches funktioniert. Jetzt will ich bestimmte Zahlen testen, ob sie eine Quadratzahl sind.

    ich werde dazu die Zahl durch die Wurzel der Zahl teilen, und nachsehen, ob es einen Nachkommateil gibt.

    Die Formel müßte so aussehen.

    int x;
    
    if (%x/sqrt(x)== 0)
    

    Das funktioniert nicht. Bin mir auch nicht sicher, wo der zweite Partner von Modulo ist?
    Auch wenn ich int nach Double tauschen passiert nichts!

    Danke für den entscheidenden Tip.

    if(x%sqrt(x) == 0) // Hier kuckt er, ob der Nachkommateil der Division Null ist.
                 {
                    qz = x;
                 }
    

    Auch das geht nicht ..


  • Mod

    Deine Formel ist falsch und deine Idee umständlich. Was ist denn das Ergebnis, wenn man eine Zahl durch ihre Wurzel teilt? Die Wurzel selbst. Also prüf doch direkt, ob die Wurzel Nachkommastellen hat und spar dir die Division. Kann man zum Beispiel mit modf machen.

    Auch wenn obiger Ansatz mathematisch richtig ist, könnte man aber bei sehr großen Zahlen technische Probleme mit der Genauigkeit bekommen. Noch besser wäre daher wohl, die Wurzel auf den nächsten Integer zu runden (einfach 0.5 addieren und dann in int umwandeln) und zu gucken, ob das Ergebnis zum Quadrat die ursprüngliche Zahl ist, also so in der Art:

    bool isSquare(unsigned value)
    {
      unsigned isqrt = sqrt(value) + 0.5;
      return isqrt * isqrt == value;
    }
    


  • Danke, hab e so gelöst:

    double param, fractpart, intpart;
                param=sqrt(x);
                fractpart=modf (param, &intpart);
                //printf ("%f = %f + %f \n", param, intpart, fractpart);
                if(fractpart == 0) qz = intpart;// Hier kuckt er, ob der Nachkommateil der Division Null ist.
    

    kannte die Funktion noch nicht, jetzt funktioniert es ....


Log in to reply