如何计算剩余百分比运作?

时间:2018-07-04 19:00:05

标签: java algorithm

我想计算简单的模运算,但假设我的除数是百分比值。简单的例子:

50 mod 20% = 0
51 mod 20% = 1
52 mod 20% = 2
53 mod 20% = 3
54 mod 20% = 4
55 mod 20% = 0

在这种情况下,它很简单number mod 5,但是对于其他百分比(例如75%),转换起来就不那么容易了。似乎应该是简单的提醒操作,但是我设法得到的最接近的东西是:

public long modulo(BigDecimal number, BigDecimal percentage) {
        BigDecimal flooredPercentValue = number.multiply(percentage).divide(HUNDRED, 0, RoundingMode.FLOOR);
        BigDecimal valueThatPercentIsInteger = flooredPercentValue.multiply(HUNDRED)
                .divide(percentage, 2, RoundingMode.HALF_UP);
        return number.subtract(valueThatPercentIsInteger).longValue();
}

可以用更简单的方式完成吗?

1 个答案:

答案 0 :(得分:1)

现在我知道我是对的:您将百分比作为主要问题,尽管它们实际上并不重要,甚至根本不存在。

问题是:

  • 给定某些物品的自然(正)数N和桶的自然数B;给定B自然数x,y,... z;
  • 将N分解为B + 1个整体(非负)项之和:N = Nx + Ny +…+ Nz + R
  • 以术语Nx…Nz保留预定义比率的方式:
    Nx:Ny:…:Nz = x:y:…:z,
    还是全为零
  • 其余R尽可能小。

等同于:

  • 尽可能将N个物品分配到B个桶中,并严格按照每个桶中物品的给定比例进行分配。

当然x,y,…z 可以合计为100,然后可以将它们视为“百分比”,但一般公式也允许比率为5:9或2:7:13 :15,不能用百分数表示。

可以通过这种方式“手动”解决问题:

  1. 将x,y,…z缩小为最大公约数(以使20:80变成1:4);
  2. 从泳池中取出x,y…和z物品
  3. 第2步是否成功(即,至少有x + y +…+ z个项目)?
  4. 如果是,则将项目分别放入存储桶中,然后从2重新开始。
  5. 否则停止。

要更快地做到这一点,我们可以用除法代替迭代减法:

  1. 将x,y,…z缩小为最大公约数(以使20:80变成1:4);
  2. 计算允许在桶中正确分配的最小物料数M
    M = x + y +…+ z;
  3. 计算比率F =下限(N / M),余数R = N模M;
  4. 将R项放在一旁
  5. 将其余部分分配为F·x,F·y,...,F·z。