如何找到 2 个数字之间的整个正方形



我想在两个数字A,B之间找到完美的平方(数字可以是正数/负数(。我还想实现 O(sqrt(abs(B(((的时间复杂度。

我为此编写了以下代码:

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

这通常效果很好,但当范围介于 -ve 和 +ve 数字之间时会失败。

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

我在SO的其他答案中找不到解决方案。因此,任何帮助将不胜感激。

让我们假设 A、B ≥ 0。

那么 A ≤ n² ≤ B 相当于 √A ≤ n≤ √B 和 ceil(√A( ≤ n ≤地板(√B(。

因此,溶液的数量为地板(√B( - ceil(√A( + 1。

如果 A <0,请将 A 替换为 0。那么如果 B <A,则没有解决方案。>


按@Bathsheba更新

最后,如果您不希望将 0 视为完全平方,请将"如果 A <0,请将 A 替换为 0"替换为"如果 A <1,请将 A 替换为 1"。

不会有完美的平方(除非我们考虑从 -无穷大到 0 的i数。因此,您可以/应该在负起始数上抛出IllegalArgumentException,或者只是将开始设置为0。

最新更新