2011-02-03 41 views

Respuesta

32

Probablemente comprobando si la raíz cuadrada del número tiene cualquier parte decimal, o si es un número entero.

Implementationwise, consideraría algo como esto:

double result = Math.Sqrt(numberToCheck); 
bool isSquare = result%1 == 0; 

isSquare Ahora debería haber true para todas las casillas, y false para todos los demás.

+8

1: Me sorprendió que el operador% trabaja en dobles –

+8

la respuesta anterior no siempre es correcto con un gran número. Intente con esto: doble resultado = Math.Sqrt (3999680306388005621); bool isSquare = resultado% 1 == 0; largo x = (largo) resultado; long y = x * x; // y no es 3999680306388005621 –

+0

No estoy seguro, pero podría ser cuando el número comienza a perder precisión/punto flotante? – Luke

0
public bool IsPerfectSquare(int num) 
{ 
    int root = (int)Math.Sqrt(num); 
    return (int) Math.Pow(root,2) == num; 
} 
4

Ésta es una variante en la comprobación de si la raíz cuadrada es integral:

bool IsPerfectSquare(double input) 
{ 
    var sqrt = Math.Sqrt(input); 
    return Math.Abs(Math.Ceiling(sqrt) - Math.Floor(sqrt)) < Double.Epsilon; 
} 

Math.Ceiling redondeará hasta el siguiente número entero, mientras que Math.Floor se redondea hacia abajo. Si son lo mismo, bueno, ¡entonces tienes un número entero!

Esto también se puede escribir como un oneliner:

if (int(Math.Ceiling(Math.Sqrt(n))) == int(Math.Floor(Math.Sqrt(n)))) /* do something */; 
+2

'Math.Ceiling()' y 'Math.Floor()' devuelven un valor doble, por lo que se encontrará con posibles problemas aquí. En su lugar, haga una comparación en coma flotante: 'if (Math.Abs ​​(val1 - valu2) michael

+0

@michael, gracias, ese es un muy buen punto! ¡He actualizado mi respuesta para reflejar esto! –

+0

¿Alguna razón para hacer ' 0'? –

1
public bool IsPerferctSquare(uint number) 
    { 
     return (Math.Sqrt(number) % 1 == 0); 
    } 
Cuestiones relacionadas