【问题标题】:Java - custom integer division functionJava - 自定义整数除法函数
【发布时间】:2018-08-16 12:21:05
【问题描述】:

我写了一段简单的代码 - ceil1。因为它在重写相同的代码后我的测试用例失败了 - ceil 工作。

public class Test {
public static void main(String args[]){
    System.out.println(ceil(3, 2)); //getting 2
    System.out.println(ceil1(3, 2)); //getting 1
}

public static int ceil(int dividend, int divisor){
    int a = dividend/divisor;
    int b = dividend%divisor == 0 ? 0:1;
    return a+b;
}

public static int ceil1(int dividend, int divisor){
    return dividend/divisor + dividend%divisor == 0 ? 0:1;
}}

我无法确定这两者之间有什么区别? 可能是中间计算/运算符优先级导致了这种混乱。

【问题讨论】:

  • 为什么不只是(a+b-1)/b
  • 尝试在 ceil1 中添加一些括号
  • 是的,是运算符优先级导致了您的问题。添加括号。

标签: java division modulus modular-arithmetic mod


【解决方案1】:

return dividend/divisor + dividend%divisor == 0 ? 0:1;

添加

dividend/divisor + dividend%divisor

执行,然后将结果与 0 进行比较。

你想要:

return dividend/divisor + (dividend%divisor == 0 ? 0:1);

return dividend/divisor + (dividend%divisor == 0) ? 0:1;

为了只将dividend%divisor0 进行比较。

【讨论】:

    【解决方案2】:

    加法 (+) 运算符的优先级高于三元 (?) 运算符。您可以用括号将该表达式括起来以获得您想要的行为:

    public static int ceil1(int dividend, int divisor){
        return dividend/divisor + (dividend%divisor == 0 ? 0:1);
    }
    

    【讨论】:

      【解决方案3】:

      /+% 的所有higher precedence 都比== 具有一个==,因此

      dividend/divisor + dividend%divisor == 0 ? 0:1
      

      等价于

      (dividend/divisor + dividend%divisor) == 0 ? 0:1
      

      所以你总是会从中得到 0 或 1。

      【讨论】:

        【解决方案4】:

        无论优先级问题如何,您的代码都会产生错误的答案。

        例如,ceil(-5, 3) 返回 0,而 Math,ceil(-5.0 / 3.0) 返回 -1(“未上限”值为 -1.666667)。

        如果你使用更简单的方法,你会得到正确的答案:

        (dividend + divisor - 1) / divisor
        

        Ideone demo

        【讨论】:

        • 我只为正整数做这件事。但这太棒了。
        • @AmitG 如果您只对正整数执行此操作,请确保在您的方法中添加前置条件检查,以便您因负整数而失败;失败比给出错误的答案要好得多。
        猜你喜欢
        • 2011-10-23
        • 2023-03-07
        • 2021-01-28
        • 1970-01-01
        • 2014-02-17
        • 2017-02-10
        • 1970-01-01
        • 2015-12-23
        • 2020-07-26
        相关资源
        最近更新 更多