2011-02-03 14 views

Odpowiedz

32

Prawdopodobnie sprawdza, czy pierwiastek kwadratowy liczby ma jakąkolwiek część dziesiętną, czy też jest liczbą całkowitą.

Implementationwise, uważam coś takiego:

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

isSquare powinien być teraz true dla wszystkich placach i false dla wszystkich innych.

+8

+1: Byłem zaskoczony, że operator% działa na podwójnej –

+8

powyższa odpowiedź nie zawsze jest poprawne z dużą liczbą. Wypróbuj to: podwójny wynik = Math.Sqrt (3999680306388005621); bool isSquare = wynik% 1 == 0; długi x = (długi) wynik; długi y = x * x; // y nie jest 3999680306388005621 –

+0

Nie jestem pewien, ale może to być, gdy liczba zaczyna tracić precyzję/zmiennoprzecinkowe? – Luke

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

Jest to odmiana o sprawdzenie czy pierwiastek kwadratowy jest integralną:

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

Math.Ceiling będzie zaokrąglić w górę do najbliższej liczby całkowitej, natomiast Math.Floor będzie zaokrąglić w dół. Jeśli są takie same, no to masz liczbę całkowitą!

To również może być zapisana jako oneliner:

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

'Math.Ceiling()' i 'Math.Floor()' zwracają podwójną wartość, więc napotkasz tutaj możliwe problemy. Zamiast tego wykonaj porównanie zmiennoprzecinkowe: 'if (Math.Abs ​​(val1 - valu2) michael

+0

@michael, dziękuję, to bardzo dobry punkt! Zaktualizowałem swoją odpowiedź, aby to odzwierciedlić! –

+0

Jakiś powód do zrobienia ' 0'? –

1
public bool IsPerferctSquare(uint number) 
    { 
     return (Math.Sqrt(number) % 1 == 0); 
    } 
Powiązane problemy