java - 仅用整数运算实现算法,汽车的多个油耗率

标签 java algorithm loops integer-arithmetic

我需要实现一种算法来驱动汽车对象。这种特定类型的汽车在旅程开始时一段时间内以较高的速度消耗燃料,并且从那以后以较低的速度消耗燃料。我正在努力仅使用整数算术(根据要求)实现该算法,同时确保其准确运行。

目前是这样的:

    int driven = 0;
    int fuelConsumed = 0;

    while (driven <= kilometresToDrive && driven <= 50) {
        // consume at 1l per 15km while journey is less than 50km
        driven += 15;
        fuelConsumed++;
    } 

    while (driven <= kilometresToDrive && driven > 50) {
        // consume at 1l per 20km while journey is greater than 50km
        driven += 20;
        fuelConsumed++;
    }

现在显然问题是第一个循环将在跳入第二个循环之前达到 60,并且速率应该在达到 50k 后发生变化。现在我可以在递增 fuelConsumed 之前再次检查它还没有超过 50k,但随后它会跳入第二个循环并将 driven 递增另外 20k 甚至没有使用任何燃料,这是另一个大问题。我考虑过很多不同的选择,但它们似乎都有一些缺点。有没有什么方法可以只使用整数运算来做到这一点,或者我上面的实现是否已经很好了?

编辑:

我应该补充一点,他们告诉我们它应该起作用的方式是,对于任何长达 15 公里的旅程,它使用一升,最多 30 公里 = 2 升,最多 45 公里 = 3 升等。然后在 50 公里之后,相同的交易,但 litresConsumed 每次驱动另一个 20k 而不是 15 跳一跳

最佳答案

如果您仅限于整数数学运算,那么结果不可能完全准确。如果 kilometresToDrive 是 40 怎么办?是2升还是3升?从技术上讲,它是 40/15 = 2.666667 升。你应该把它四舍五入吗,因为整数数学会截断,而不是四舍五入,所以在纯整数数学中,它会是 2。

无论如何,不​​要使用循环。计算结果。

如果小于 50,则为 kilometresToDrive/15

如果超过 50,则公式为 50/15 + (kilometresToDrive - 50)/20。为了减少舍入误差,您应该将舍入推迟到末尾,因此乘以和除以 60:

50 / 15 + (kilometresToDrive - 50) / 20
(50 / 15 * 60 + (kilometresToDrive - 50) / 20 * 60) / 60
(50 * 4 + kilometresToDrive * 3 - 50 * 3) / 60
(50 + kilometresToDrive * 3) / 60

这意味着您的代码将是:

int fuelConsumed = (kilometresToDrive <= 50
                    ? kilometresToDrive / 15
                    : (50 + kilometresToDrive * 3) / 60);

更新

It is supposed to work so that for any journey up to 15km, it uses one litre, up to 30km = 2 litres, up to 45km = 3 litres etc.

此要求意味着数学需要向上舍入,而不是像整数数学那样截断。要在整数数学中强制进行舍入,请在除法之前将除数减一。

示例:1/15 = 0 是普通整数数学。
(1 + 14)/15 = 1 是用于进行舍入逻辑的整数数学运算。

因此,为了获得四舍五入的结果,我们调整公式:
x/15(x + 14)/15
(50 + x)/60(50 + x + 59)/60(109 + x)/60

int fuelConsumed = (kilometresToDrive <= 50
                    ? (14 + kilometresToDrive) / 15
                    : (109 + kilometresToDrive * 3) / 60);

如果您想验证结果,您可以进行浮点运算:

double fuelConsumed = (kilometresToDrive <= 50
                       ? kilometresToDrive / 15d
                       : 50 / 15d + (kilometresToDrive - 50) / 20d);
fuelConsumed = Math.ceil(fuelConsumed);  // Round Up

关于java - 仅用整数运算实现算法,汽车的多个油耗率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074229/

相关文章:

java - 多次使用 "new File"的内存

java - 多线程java程序阻止cpu监控自身热度

arrays - 执行排序操作时数据分布配置文件的确定性

algorithm - 决策树中叶子的最短可能深度(比较排序算法)

python - 查找由数组的 2 个唯一元素生成的所有产品(python)

java - Java 中的类型推断

java - Hibernate - OutOfMemoryError - java 堆大小

javascript - 国际象棋 AI 需要一个非递归的、基于迭代的 negamax 算法

python - 上下文管理器在异常后重试 block

loops - 了解循环不变式。寻找并证明它们的算法