【发布时间】:2017-07-18 14:52:05
【问题描述】:
我想在两个数字 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 的其他答案中找不到解决方案。因此,任何帮助将不胜感激。
【问题讨论】:
-
为什么是 C++ 标签?
-
我可以接受 Java / C++ 的解决方案。我对逻辑更感兴趣
-
floor(sqrt(abs(1)))是 1,ceil(sqrt(abs(-1)))是 1,所以如果你从另一个中减去一个并加 1,你会得到...... 1. 这里有什么问题?除此之外,请记住,使用双精度可能会导致精度问题,因此转换为int可能会产生意想不到的结果。 -
负数是完全平方是什么意思?你想要可以分解成
(a + ib) * (a - ib)的数字吗? -
@Thomas .. 我认为答案应该是 2 而不是 1。
标签: algorithm language-agnostic