Hallo,
hab mir ein paar Zeilen geschrieben, die überprüfen sollen ob eine Zahl eine Quadratzahl (z.B. 9, 49, 64) ist. Allerdings ist der noch nicht wirklich effizient. Wäre super wenn sich das mal jemand anschauen könnte und vielleicht einen Verbesserungsvorschlag machen könnte.
Hier eine kurze Beschreibung des Algorithmus:
Zuerst werden die letzten beiden Ziffern der übergebenen Zahl gespeichert. Das liegt daran, dass man anhand der letzten beiden Ziffern oft ausschliessen kann dass es eine Quadratzahl ist. Bei einer Quadratzahl gibt es es nur 22 Möglichkeiten: 00, x1, x4, 25, y6 und x9, wobei x für eine gerade und y für eine ungerade Ziffer steht. (Quelle: Wikipedia).
Falls die Zahl den obigen Anforderungen entspricht, wird mit:
überprüft ob es wirklich eine Quadratzahl ist. Es wird folgendes berechnet: (number^(1/2))² == number
Leider rundet Math.sqrt, ansonsten würde man schon erkennen, ob es eine Quadratzahl ist, indem man schaut ob die Wurzel eine ganze Zahl ergibt. Da Math.sqrt und Math.pow nur Double unterstützen, hab ich das häßliche Double.parseDouble() benutzt.
Wäre super wenn jemand den Algorithmus verbessern könnte, denn ich glaube der ist noch ziemlich ineffizient
hab mir ein paar Zeilen geschrieben, die überprüfen sollen ob eine Zahl eine Quadratzahl (z.B. 9, 49, 64) ist. Allerdings ist der noch nicht wirklich effizient. Wäre super wenn sich das mal jemand anschauen könnte und vielleicht einen Verbesserungsvorschlag machen könnte.
Code:
public boolean checkifsquarenumber2(int number){
boolean check = false;
int lastnumber, secondlastnumber;
String aaa = String.valueOf(number);
lastnumber = Integer.parseInt(String.valueOf( aaa.charAt(aaa.length()-1))); // get the last number
secondlastnumber = Integer.parseInt(String.valueOf( aaa.charAt(aaa.length()-2))); // get the secondlast number
if (secondlastnumber == 2 || secondlastnumber == 4 || secondlastnumber == 6 || secondlastnumber == 8 || secondlastnumber == 0){
if (lastnumber == 1 || lastnumber == 4 || lastnumber == 9){
if (Math.pow(Math.sqrt(Double.parseDouble(aaa)),2) == Double.parseDouble(aaa)){ // checks if: (number^(1/2))² == number
check = true;
}
}
}
if ((secondlastnumber == 1 || secondlastnumber == 3 || secondlastnumber == 5 || secondlastnumber == 7 || secondlastnumber == 9) && lastnumber == 6){
if (Math.pow(Math.sqrt(Double.parseDouble(aaa)),2) == Double.parseDouble(aaa)){
check = true;
}
}
return check;
}
Hier eine kurze Beschreibung des Algorithmus:
Zuerst werden die letzten beiden Ziffern der übergebenen Zahl gespeichert. Das liegt daran, dass man anhand der letzten beiden Ziffern oft ausschliessen kann dass es eine Quadratzahl ist. Bei einer Quadratzahl gibt es es nur 22 Möglichkeiten: 00, x1, x4, 25, y6 und x9, wobei x für eine gerade und y für eine ungerade Ziffer steht. (Quelle: Wikipedia).
Falls die Zahl den obigen Anforderungen entspricht, wird mit:
Code:
if (Math.pow(Math.sqrt(Double.parseDouble(aaa)),2) == Double.parseDouble(aaa))
Leider rundet Math.sqrt, ansonsten würde man schon erkennen, ob es eine Quadratzahl ist, indem man schaut ob die Wurzel eine ganze Zahl ergibt. Da Math.sqrt und Math.pow nur Double unterstützen, hab ich das häßliche Double.parseDouble() benutzt.
Wäre super wenn jemand den Algorithmus verbessern könnte, denn ich glaube der ist noch ziemlich ineffizient