可能性の重複:完璧なスクエアをチェックする最短の方法は?
:1, 4, 9, 16, 25, 36, 49, 64, 81, 100, ......
What's a good algorithm to determine if an input is a perfect square?
私が最短と番号を確認する最も簡単な方法は、C#
パーフェクト正方形の一部で完璧な正方形でありたいです
可能性の重複:完璧なスクエアをチェックする最短の方法は?
:1, 4, 9, 16, 25, 36, 49, 64, 81, 100, ......
What's a good algorithm to determine if an input is a perfect square?
私が最短と番号を確認する最も簡単な方法は、C#
パーフェクト正方形の一部で完璧な正方形でありたいです
おそらく、数値の平方根に小数部があるのか、それとも整数であるのかを調べます。
double result = Math.Sqrt(numberToCheck);
bool isSquare = result%1 == 0;
isSquare
今すべての正方形のためtrue
こと、および他のすべてのためのfalse
必要があります。
Implementationwise、私はこのような何かを検討します。
1:私は、%演算子はダブルスで働くことに驚きました –
上記の回答必ずしも大量で正しいとは限りません。これを試してみてください: double result = Math.Sqrt(3999680306388005621); ブールisSquare =結果%1 == 0; long x =(long)result; long y = x * x; // yは3999680306388005621ではありません –
私は確信していますが、数値が精度/浮動小数点数を失い始めることがありますか? – Luke
public bool IsPerfectSquare(int num)
{
int root = (int)Math.Sqrt(num);
return (int) Math.Pow(root,2) == num;
}
これは平方根が整数であるかどうかをチェックするの変種である: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 */;
'Math.Ceiling()'と 'Math.Floor()'は二重の値を返しますので、ここで問題が発生します。代わりに浮動小数点の比較を行います: 'if(Math.Abs(val1 - valu2)
@michael、ありがとう、それは非常に良い点です!私はこれを反映するために私の答えを更新しました! –
'> 0'の代わりに'
public bool IsPerferctSquare(uint number)
{
return (Math.Sqrt(number) % 1 == 0);
}
その質問はDUPと閉じている@dogbane:D –