Duplicar posibles:
Fastest way to determine if an integer's square root is an integer¿Qué es un buen algoritmo para determinar si una entrada es un cuadrado perfecto?
¿Qué es una manera de ver si un número es un perfect square?
bool IsPerfectSquare(long input)
{
// TODO
}
estoy usando C#, pero este es el lenguaje agnóstico.
Puntos de bonificación por claridad y simplicidad (esto no pretende ser código de golf).
Editar: Esto tiene mucho más complejo de lo que esperaba! Resulta que los problemas con la doble precisión se manifiestan de dos maneras. Primero, Math.Sqrt toma un doble que no puede aguantar mucho (gracias Jon).
En segundo lugar, la precisión de un doble perderá valores pequeños (.000 ... 00001) cuando tenga un cuadrado enorme, casi perfecto. Por ejemplo, mi implementación no pasó esta prueba para Math.Pow (10,18) +1 (la mía fue verdadera).
También puedes buscar el método 'lsqrt' utilizado para la raíz cuadrada entera. – leppie
Michael, Bill the Lizard hizo un buen punto que es solo una pregunta similar, no el duplicado exacto. No creo que la pregunta deba ser cerrada. Además, el problema del cuadrado perfecto es mucho más complejo en términos prácticos de lo que parece y las respuestas aquí hacen una gran contribución. –
Para la solución que elijas, no olvides anteponer una comprobación rápida de la negatividad. – angus