【问题标题】:how to find whole squares between 2 numbers如何找到两个数字之间的整个正方形
【发布时间】: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


【解决方案1】:

让我们假设 A,B ≥ 0。

那么 A ≤ n² ≤ B 等价于 √A ≤ n ≤ √B 和 ceil(√A) ≤ n ≤ floor(√B)。

因此,解的数量是 floor(√B) - ceil(√A) + 1。

如果 A


@Bathsheba 更新

最后,如果您不希望 0 被认为是一个完美的正方形,请将“如果 A

【讨论】:

  • 是最好的答案。 A > 0 和 B >= A 的分析将是锦上添花。 (我从0不是完美的方旅,除非你推广到复平面)。
  • @Bathsheba: 如果 A
  • 确实;如果答案是这样,那么如果可以的话,我会再次投票。
  • @Bathsheba:我正在履行 OP 给出的规范。
  • 我无法抗拒。如果您发现我的编辑令人反感,请回滚。可能对未来的读者有用。
【解决方案2】:

不会有完美的正方形(除非我们考虑带有从 -infinity 到 0 的 i 的数字。所以您可以/应该在负数开始时抛出 IllegalArgumentException,或者只是将开始设置为 0。

【讨论】:

  • 我同意。但我假设 0 是完美的正方形。所以,应该算
  • @Sushil 也许我的数学今天不起作用,但看起来如果你按照我的建议你的计数公式将计算 1 - 0 + 1 = 2,这就是你想要的?
  • 我认为你是正确的。通过此更改,我将获得正确的计数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多