2017-07-18 67 views
-2

我想找到两个数字A,B(数字可以是正数/负数)之间的完美平方。我也想实现O(sqrt(abs(B)))的时间复杂度。如何找到2个数字之间的整个方块

我写了下面的代码是:

count = (int)(Math.floor(Math.sqrt(Math.abs(B)) - Math.ceil(Math.sqrt(Math.abs(A))) + 1); 

这通常效果很好,但是当范围是-ve到+数字已经失败。

例如是范围为A = 1,B = 1。然后我认为它应该返回2(0,1),但返回1

我无法找到在其他的答案的溶液中SO。所以,任何帮助将不胜感激。

+4

为什么使用C++标签? – UnholySheep

+0

我很满意Java/C++的解决方案。我对逻辑更感兴趣 – Sushil

+0

'floor(sqrt(abs(1)))'是1,'ceil(sqrt(abs(-1)))'是1,所以如果你从另一个中减去一个并加1得到... 1.这里有什么问题?除此之外,请记住,使用双精度可能会导致精度问题,因此将其转换为int可能会产生意想不到的结果。 – Thomas

回答

1

不会有完美的平方(除非我们有i考虑-infinity 0号码所以,你可以/应该扔在开局不利数一个IllegalArgumentException,或者仅仅是一个开始设置为0

+0

我同意。但我认为0是完美的正方形。所以,它应该被计数 – Sushil

+0

@Sushil也许我的数学算法今天不工作,但它看起来像你做我建议你的计数公式计算1 - 0 + 1 = 2,这是你想要的吗? – ControlAltDel

+0

我认为你对此是正确的。有了这个改变,我会得到正确的计数 – Sushil

3

我们假定A,B≥0

然后A≤N²≤B等效于√A≤N≤whisky,并且小区(√A)≤N≤地板(whisky,)。

因此, (√B) - ceil(√A)+1。

如果A < 0,则将A替换为0.然后,如果B < A没有解决方案。


更新由@Bathsheba

最后,如果你不想0被认为是一个完全平方数千万然后替换 “如果一个< 0,0代替A”“如果A < 1,用1替换A.“

+0

是上级答案。一个分析,其中A> 0和B> = A将是蛋糕上的糖霜。(我从0不是一个完美的方队,除非你推广到复杂的平面)。 – Bathsheba

+0

@Bathsheba:如果A <1将A替换为1. –

+0

确实;如果那是在答案中,那么如果可以的话我会再次投票。 – Bathsheba

相关问题