2011-02-03 31 views

Trả lời

32

Có thể kiểm tra xem căn bậc hai của số có bất kỳ phần thập phân nào không, hoặc nếu nó là một số nguyên.

Implementationwise, tôi sẽ xem xét một cái gì đó như thế này:

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

isSquare bây giờ sẽ được true cho tất cả các hình vuông, và false cho tất cả những người khác.

+8

1: Tôi đã rất ngạc nhiên rằng các nhà điều hành% hoạt động trên đôi –

+8

Câu trả lời ở trên không phải lúc nào cũng đúng với số lượng lớn. Hãy thử với điều này: kết quả kép = Math.Sqrt (3999680306388005621); bool isSquare = kết quả% 1 == 0; dài x = (dài) kết quả; long y = x * x; // y không phải là 3999680306388005621 –

+0

Tôi không chắc chắn nhưng đó có thể là khi con số bắt đầu mất điểm chính xác/dấu chấm động? – Luke

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

Đây là một biến thể về kiểm tra nếu căn bậc hai là không thể thiếu:

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

Math.Ceiling sẽ làm tròn lên đến số nguyên tiếp theo, trong khi Math.Floor sẽ làm tròn xuống. Nếu họ là như nhau, tốt, sau đó bạn có một số nguyên!

này cũng có thể được viết như một oneliner:

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

'Math.Ceiling()' và 'Math.Floor()' trả về một giá trị kép, do đó bạn sẽ gặp phải các vấn đề có thể xảy ra tại đây. Thay vào đó, làm một so sánh dấu chấm động: 'if (Math.Abs ​​(val1 - valu2) michael

+0

@michael, cảm ơn bạn, đó là một điểm rất tốt! Tôi đã cập nhật câu trả lời của mình để phản ánh điều này! –

+0

Bất kỳ lý do nào để làm ' 0'? –

1
public bool IsPerferctSquare(uint number) 
    { 
     return (Math.Sqrt(number) % 1 == 0); 
    } 
Các vấn đề liên quan