【问题标题】:Trying to find cause of possible overflow in my approach when trying to solve尝试解决时试图在我的方法中找到可能溢出的原因
【发布时间】:2020-02-07 08:38:20
【问题描述】:

我正在解决一个问题

找出小于等于 A 且能被 A 整除的总数 B 和 C。

我写了以下函数来计算相同的

 public int solve(int A, int B, int C) {
        if(B==C){
            return A/B;
        }else{
            return A/(B*C);
        }
    }

虽然这给了我正确的答案,但这很容易溢出;我怀疑当我们将 b 和 c 相乘时。我无法理解如何更正此功能以克服溢出问题。

我不是在寻找具体的答案,而是对了解更感兴趣

  1. 我说的对吗?
  2. 可能的修正提示

【问题讨论】:

  • 如何解决查找具有该属性的所有个数字的问题?它只返回一个数字。
  • 对不起,我的错。问题描述将是“查找总数”

标签: algorithm number-theory


【解决方案1】:

您的实现不正确。反例:

A = 100
B =  10
C =   8
  • 预期:2(数字为4080
  • 实际:1 (A / (B * C) == 100 / 80 == 1)

正确的公式是

A / (B * C / gcd(B, C))

其中gcd 代表greatest common divisor

【讨论】:

  • 谢谢;我试图用直觉来 -> A* B/GCD(A,B) = B * A/GCD(A,B) = 可以被 A 和 B 整除的数字。取 A 10 和 B = 8;可以分别写为 2 * 5 & 2 * 2 * 2。现在要找到可以被 A 和 B 整除的所有数字,我们采用非公用部分 * 公用部分,即 gcd。我们想出 40 个然后继续它。
  • 我们正在尝试查找 LCM(B,C) 的所有乘数?
  • @Rishi:是的,lcm(B, C) == B * C / gcd(B, C)
猜你喜欢
  • 2017-10-25
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2013-09-13
  • 2021-09-16
  • 1970-01-01
  • 2023-02-08
相关资源
最近更新 更多