Что должен определить хороший алгоритм, является ли вход полным квадратом? [дубликат]

85
задан Community 23 May 2017 в 11:54
поделиться

3 ответа

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

Это может убежать [приблизительно 112] из проблем просто проверки, "квадратный корень целое число", но возможно не все. Потенциально необходимо стать немного более напуганными:

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;
}

Неприглядный, и ненужный для чего-либо кроме действительно больших значений, но я думаю, что это должно работа...

116
ответ дан sakibmoon 24 November 2019 в 08:20
поделиться
bool IsPerfectSquare(long input)
{
    long SquareRoot = (long) Math.Sqrt(input);
    return ((SquareRoot * SquareRoot) == input);
}
12
ответ дан sakibmoon 24 November 2019 в 08:20
поделиться

В языке Common LISP я использую следующее:

(defun perfect-square-p (n)
  (= (expt (isqrt n) 2)
     n))
9
ответ дан Svante 24 November 2019 в 08:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: