使用公式最简单的方法可能是使用整数除法,首先捕获特殊条件:
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);
}
}
而且,顺便说一句,我不完全确定像这样汇总您的库存是否符合犹太教规(假设函数名称是准确的)。我可以想象您可能想要减少库存(例如想要保留一些库存)但四舍五入似乎是一个很大的谎言的情况。
当您的客户进来发现库存实际上已经耗尽时,您打算告诉他们什么?
或者你是那些会做任何事情来吸引顾客进入商店的笨拙的经营者之一?:-)