-5

我做了一个简单而低效的方法来四舍五入到最接近的 9。这就是我所拥有的

private int getInventorySize(int max) {
    if (max <= 9){
        return 9;
    }else if (max <= 18){
        return 18;
    }else if (max <= 27){
        return 27;
    }else if (max <= 36){
        return 36;
    }else if (max <= 45){
        return 45;
    }else if (max <= 54){
        return 54;
    }else{
        return 54;
    }

但是正如您所看到的,这种方法并不是最好的方法,有人可以发布一个示例以有效的方式做到这一点,PS。如果 int max 大于 54 .. 它需要返回 54 谢谢。

4

8 回答 8

4

你可以做:

private int getInventorySize(int max) {
    if (max <= 0) return 9;
    int quotient = (int)Math.ceil(max / 9.0);
    return quotient > 5 ? 54: quotient * 9;
}

将数字除以9.0。取天花板将使您获得下一个积分商。如果 quotient is > 5,则只需 return 54,否则quotient * 9将为您9提供该商的倍数。

一些测试用例:

// Negative number and 0
System.out.println(getInventorySize(-1));  // 9
System.out.println(getInventorySize(0));   // 9

// max <= 9
System.out.println(getInventorySize(5));   // 9
System.out.println(getInventorySize(9));   // 9

// some middle case 
System.out.println(getInventorySize(43));  // 45

// max >= 54
System.out.println(getInventorySize(54));  // 54
System.out.println(getInventorySize(55));  // 54
于 2013-10-04T05:20:21.713 回答
1

查看 mod 运算符。它是类型化%的,将产生长除法运算的剩余部分。

一旦你有了余数,你就可以大大简化你的四舍五入。您知道是否需要使用简单的 if 语句进行向上或向下舍入。然后要找出需要向上或向下舍入到 9倍数,用运算符除(仅整数除法)/并重新相乘。

于 2013-10-04T05:20:39.200 回答
1

你用这样的模数做一个单线:

return (max>=54) ? 54 : max+(9-max%9)*Math.min(1,max%9);
于 2013-10-04T05:25:51.950 回答
0
private int getInventorySize (int max) {
    if (max < 9) return 9;
    for (int i = 9; i <= 54; i += 9) {
        if (max <= i) {
            return i;
        }
    }
    return 54;
}
于 2013-10-04T05:21:44.660 回答
0

使用公式最简单的方法可能是使用整数除法,首先捕获特殊条件:

private int getInventorySize (int max) {
    if (max <  1) return  9;
    if (max > 54) return 54;
    max += 8;
    return max - (max % 9);
}

下表显示了它是如何工作的:

max   max+8[A]   A%9[B]   A-B
---   --------   ------   ---
 <1                         9
  1          9        0     9
  2         10        1     9
  :
  8         16        7     9
  9         17        8     9
 10         18        0    18
  :
 18         26        8    18
 19         27        0    27
  :
 53         61        7    54
 54         62        8    54
>54                        54

但是,请记住,您在问题中提出的内容本质上没有任何问题,但是您可以对其进行大量清理,使其比基于数学的解决方案更易于理解(如果您的输入范围更大,您不会使用这种方法,因为if语句的数量会变得笨拙):

private int getInventorySize (int max) {
    if (max <=  9) return  9;
    if (max <= 18) return 18;
    if (max <= 27) return 27;
    if (max <= 36) return 36;
    if (max <= 45) return 45;
    return 54;
}

构造的使用if ... return ... else是完全没有必要的,因为它else是多余的——如果它不会发生,它return就会已经返回。

同样,当两个单独的案例可以合并为一个时返回 54 是没有意义的。

老实说,如果您不希望输入范围增加,我实际上会选择第二种解决方案,因为考虑到它的大小,它实际上更容易理解。

正如您从以下测试工具中看到的那样,这两种方法都有效(更改哪一种方法被注释掉以在它们之间切换)。我建议将此处的任何其他答案插入测试工具中,以确保它们也可以工作(您必须使它们类似static地使它们按原样工作):

public class Tester {
    private static int getInventorySize (int max) {
        if (max < 1) return 9;
        if (max > 45) return 54;
        max += 8;
        return max - (max % 9);
    }

    //private static int getInventorySize (int max) {
    //    if (max <=  9) return  9;
    //    if (max <= 18) return 18;
    //    if (max <= 27) return 27;
    //    if (max <= 36) return 36;
    //    if (max <= 45) return 45;
    //    return 54;
    //}

    public static void check (int a, int b) {
        int sz = getInventorySize(a); 
        if (sz != b)
            System.out.println ("Error, " + a + " -> " + sz + ", not " + b);
    }

    public static void main (String [] args) {
        for (int i = -9999; i <= 9; i++) check (i, 9);
        for (int i = 10; i <= 54; i += 9) {
            check (i+0, i+8); check (i+1, i+8); check (i+2, i+8);
            check (i+3, i+8); check (i+4, i+8); check (i+5, i+8);
            check (i+6, i+8); check (i+7, i+8); check (i+8, i+8);
        }
        for (int i = 55; i <= 9999; i++) check (i, 54);
    }
}

而且,顺便说一句,我不完全确定像这样汇总您的库存是否符合犹太教规(假设函数名称是准确的)。我可以想象您可能想要减少库存(例如想要保留一些库存)但四舍五入似乎是一个很大的谎言的情况。

当您的客户进来发现库存实际上已经耗尽时,您打算告诉他们什么?

或者你是那些会做任何事情来吸引顾客进入商店的笨拙的经营者之一?:-)

于 2013-10-04T05:26:44.677 回答
0
int round(int num) {
        return (num>54)?54:(num%9==0)?num:((num/9)+1)*9;
}
于 2013-10-04T05:50:15.187 回答
0
private int getInventorySize(int max) {
    if (max < 9) {
        return 9;
    }
    if (max <= 54 && max > 9) {
        int a = max / 9;
        return a * 9;
    } else
        return 54;
}
于 2013-10-04T05:59:31.037 回答
0

超级简单!干得好:

Math.ceil((number/9))*9
于 2015-11-05T22:51:07.210 回答