Cómo verificar rápidamente si la raíz cuadrada de un entero es un entero
¡Hola a todos! Soy un desarrollador Java principiante y me encontré con una tarea: necesito determinar si la raíz cuadrada de un entero es un entero (es decir, el número es un cuadrado perfecto). Por ejemplo, 25 — sí (5), 26 — no.
Primero escribí esto:
```java
public static boolean isPerfectSquare(int n) {
double sqrt = Math.sqrt(n);
return sqrt == Math.floor(sqrt);
}
```
Pero luego pensé: ¿y si debido a errores de precisión de double esto funciona incorrectamente para números grandes? Por ejemplo, para n = 2147483647 (el máximo int) o cerca de los límites. ¿Quizás es mejor usar aritmética de enteros? ¿Pero cómo?
Probé con un bucle:
```java
for (int i = 1; i * i <= n; i++) {
if (i * i == n) return true;
}
return false;
```
Pero esto es terriblemente lento para n grandes. ¿Hay alguna forma más rápida? En internet vi menciones sobre búsqueda binaria, pero no estoy seguro de cómo aplicarla. Lo necesito específicamente para Java, y que funcione para todos los int desde 0 hasta Integer.MAX_VALUE. Por favor, indíquenme la forma más rápida.