关于c#:任何人都知道逻辑找出一个数字是完美的正方形还是没有?


Anybody Knows the Logic To Find Out a Number is Perfect Square or not?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Fastest way to determine if an integer's square root is an integer

有人知道找出一个数是否是完全平方的逻辑吗?(Other than Newtons Method or Synthetic Division Method)

1
For Eg:- 4, 16, 36, 64 are Perfect Squares.

我将以441的形式给出输入,逻辑应该说明它是否是一个完美的平方。

这是亚马逊采访中问的一个问题。

我想用任何内置功能来完成


没有数学,sqrt,甚至没有乘法:

1
2
3
4
5
6
7
8
9
10
11
12
13
    static bool IsSquare(int n)
    {
        int i = 1;
        for (; ; )
        {
            if (n < 0)
                return false;
            if (n == 0)
                return true;
            n -= i;
            i += 2;
        }
    }

注意,平方是奇数的部分和。i的值为1、3、5、7,…。部分和1,1+3=4,1+3+5=9,…是正方形。所以在n -= i之后,我们从n的原始值中减去了平方,我们可以将结果与0进行比较。


我要问面试官的第一个问题是,"问题的制约因素是什么?"也就是说,输入数字可以有多大?如果它足够小,那么您可以预先计算出所有完美的平方数,并将它们存储在字典中:

1
2
3
4
IDictionary<long, bool> squares = new Dictionary<long, bool>;
for(long i = 1; i*i <= MAX_NUM; ++i) {
    squares[i*i] = true;
}

然后,为了找出一个数字x是否是一个完美的正方形,你只要检查正方形[x]看看它是否是真的。


沿着这条线的某些东西会起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public Boolean IsSquare(double input)
{
    double root, product;
    Boolean isSquare,isGTInput;

    root = 1;
    product = 0;
    isSquare = false;
    isGTInput = false;

    while (!isSquare && !isGTInput)
    {
        product = root * root;
        if (product == input)
            isSquare = true;
        else if (product > input)
            isGTInput = true;

        root += 1;
    }

    return isSquare;

}