有人知道找出一个数字的逻辑是不是是完美平方吗? [复制]
Posted
技术标签:
【中文标题】有人知道找出一个数字的逻辑是不是是完美平方吗? [复制]【英文标题】:Anybody Knows the Logic To Find Out a Number is Perfect Square or not? [duplicate]有人知道找出一个数字的逻辑是否是完美平方吗? [复制] 【发布时间】:2011-09-25 23:07:21 【问题描述】:可能重复:Fastest way to determine if an integer's square root is an integer
有人知道找出一个数字是否是完美平方的逻辑吗? (Other than Newtons Method or Synthetic Division Method
)
For Eg:- 4, 16, 36, 64 are Perfect Squares.
我将输入为441
,逻辑应该判断它是否是完美正方形。
这是亚马逊面试中提出的一个问题。
我想在没有任何内置函数的情况下这样做
【问题讨论】:
What's a good algorithm to determine if an input is a perfect square? 如果诀窍在于输入本身,那么由于 441 在右侧有一个,那么它不可能是完美正方形。 @Jalal:什么,像 81 不是? :-) @Jalal - 441 = 21^2。至少检查一下... 此外,取任何以 1 结尾的数字,例如 52941,将其乘以自身,得到一个以 1 结尾的正方形。 @regularfry: @Kobi: 我以为那只是 2 的 n 次方。 【参考方案1】:我要问面试官的第一个问题是,“问题限制是什么?”也就是说,输入的数字可以有多大?如果它足够小,那么您可以预先计算所有完美的正方形并将它们存储在字典中:
IDictionary<long, bool> squares = new Dictionary<long, bool>;
for(long i = 1; i*i <= MAX_NUM; ++i)
squares[i*i] = true;
然后,要确定一个数字 x 是否是一个完美的正方形,您只需检查 squares[x] 以查看它是否为真。
【讨论】:
【参考方案2】:类似的东西会起作用。
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
时,这会按照我的要求进行吗
我不认为乘法算作“内置函数”。如果你不能使用乘法运算符,那可能是不可能的。【参考方案3】:
没有 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进行比较。
【讨论】:
现在试试看,不用加法或乘法:) 不得不说,我很喜欢这个算法。 尽管从快速基准测试来看,使用乘法似乎更快。 惊人的算法,脱帽致敬,伙计。我后悔为什么我讨厌数学:) 我希望我能给你提供数百万的赏金......真的很感激......以上是关于有人知道找出一个数字的逻辑是不是是完美平方吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章