2011-02-03 6 views

答えて

32

おそらく、数値の平方根に小数部があるのか​​、それとも整数であるのかを調べます。

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

isSquare今すべての正方形のためtrueこと、および他のすべてのためのfalse必要があります。

Implementationwise、私はこのような何かを検討します。

+8

1:私は、%演算子はダブルスで働くことに驚きました –

+8

上記の回答必ずしも大量で正しいとは限りません。これを試してみてください: double result = Math.Sqrt(3999680306388005621); ブールisSquare =結果%1 == 0; long x =(long)result; long y = x * x; // yは3999680306388005621ではありません –

+0

私は確信していますが、数値が精度/浮動小数点数を失い始めることがありますか? – Luke

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

これは平方根が整数であるかどうかをチェックするの変種である:Math.Floorは切り捨てになるのに対し、

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

Math.Ceilingは、次の整数に切り上げます。彼らが同じであれば、まあ、あなたは整数を持っています!

これもonelinerのように書くことができます。

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

'Math.Ceiling()'と 'Math.Floor()'は二重の値を返しますので、ここで問題が発生します。代わりに浮動小数点の比較を行います: 'if(Math.Abs​​(val1 - valu2) michael

+0

@michael、ありがとう、それは非常に良い点です!私はこれを反映するために私の答えを更新しました! –

+0

'> 0'の代わりに'

1
public bool IsPerferctSquare(uint number) 
    { 
     return (Math.Sqrt(number) % 1 == 0); 
    } 
関連する問題