1. ホーム
  2. algorithm

[解決済み] 入力が真四角かどうかを判断する良いアルゴリズムとは?重複

2023-02-14 19:09:19

質問

重複の可能性があります。

整数の平方根が整数であるかどうかを判断する最速の方法

であるかどうかを確認する方法は? 完全平方 ?

bool IsPerfectSquare(long input)
{
   // TODO
}

私はC#を使用していますが、これは言語に依存しません。

分かりやすさとシンプルさにボーナスポイントがあります(これはコードゴルフをするためのものではありません)。


編集します。 これは私が予想したよりはるかに複雑になりました! 倍精度の問題は、いくつかの方法で現れることがわかりました。まず、Math.Sqrtはlongを正確に保持できないdoubleを取ります(Jonに感謝)。

たとえば、私の実装は Math.Pow(10,18)+1 のこのテストに失敗しました (私のは true を報告しました)。

どのように解決するのですか?

bool IsPerfectSquare(long input)
{
    long closestRoot = (long) Math.Sqrt(input);
    return input == closestRoot * closestRoot;
}

から離れるかもしれません。 いくつかの をチェックすることの問題点から逃れることができるかもしれません。潜在的に、もう少しファンキーになる必要があります。

bool IsPerfectSquare(long input)
{
    double root = Math.Sqrt(input);

    long rootBits = BitConverter.DoubleToInt64Bits(root);
    long lowerBound = (long) BitConverter.Int64BitsToDouble(rootBits-1);
    long upperBound = (long) BitConverter.Int64BitsToDouble(rootBits+1);

    for (long candidate = lowerBound; candidate <= upperBound; candidate++)
    {
         if (candidate * candidate == input)
         {
             return true;
         }
    }
    return false;
}

大きな値以外では不必要ですが、私は が必要です。 は機能するはずです...