可能重复:
确定整数的平方根是否为整数的最快方法
有人知道判断一个数字是否为完全平方数的逻辑吗?(除了牛顿法或合成除法法
)
For Eg:- 4, 16, 36, 64 are Perfect Squares.
我将输入
441
,逻辑应该判断它是否为完全平方数。这是亚马逊面试中的一个问题。我希望不使用任何内置函数来解决。可能重复:
确定整数的平方根是否为整数的最快方法
有人知道判断一个数字是否为完全平方数的逻辑吗?(除了牛顿法或合成除法法
)
For Eg:- 4, 16, 36, 64 are Perfect Squares.
441
,逻辑应该判断它是否为完全平方数。这是亚马逊面试中的一个问题。我希望不使用任何内置函数来解决。没有Math.Sqrt,甚至没有乘法:
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进行比较。
我会问面试官的第一个问题是:“问题的限制条件是什么?”也就是说,输入数字可以有多大?如果足够小,那么您可以预先计算所有完美平方并将它们存储在字典中:
IDictionary<long, bool> squares = new Dictionary<long, bool>;
for(long i = 1; i*i <= MAX_NUM; ++i) {
squares[i*i] = true;
}
然后,要判断一个数字x是否是完全平方数,只需检查squares[x]是否为真即可。
类似这样的东西会起作用。
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;
}
root*root
,这是否符合我所问的要求? - Developer