具有倍数和最大数集的最高乘法
Highest multiplication with multiple and max number set
不太确定将此标题设置为什么,或者甚至要搜索什么。所以我只问这个问题,希望我不会得到太多反对票。
我正在尝试找到最简单的方法来根据两个固定数字找到最大可能的数字。
例如:
我最多可以乘以 18(第一个数字)。但不要超过结果数字,比如 100(第二个数字)。
2 x 18 = 36
5 x 18 = 90
但如果第一个数字较大,则第二个数字需要小于 18,如下所示:
11 x 9 = 99
16 x 6 = 96
这里我会选择11,因为即使第二个数字只有9,结果也是最高的。第二个数字可以是任何数字,只要它是 18 或更低。第一个数字可以是任何数字,只要答案保持在 100 以下即可。明白我的意思吗?
所以我的问题是,如何在不使用开关、if/then 语句或一堆循环的情况下将其写入 php?是否有一些我不知道的数学运算符可以处理这类事情?
谢谢。
编辑:
我现在使用的代码是:
function doMath($cost, $max, $multiplier) {
do {
$temp = $cost * $multiplier;
if ($temp > $max) { --$multiplier; }
} while ($temp > $max);
return array($cost, $temp, $multiplier);
}
如果我们看一下 11 * 9 = 99 的例子,
$result = doMath(11, 100, 18);
会return,
$cost = 11,$temp = 99,$multiplier = 9
希望有一种更简单的方法,这样我就不需要使用循环了,因为我需要检查的数字太多了。
如果我没理解错的话,你正在寻找 the floor function, combining it with the min function。
较大的数字 c
和较小的数字 a
都是问题的一部分,并且您想在 [0, m]
范围内找到一个数字 b
这样的a * b
最大,同时保持小于(严格)小于 c
。
在你的例子中,100/18 = 5.55555,这意味着 18*5 小于 100,而 18*6 大于 100。
因为 floor
得到了浮点数的整数部分,所以 $b = floor($c/$a)
做你想做的。当 a
除 c
时(也就是说,c/a
已经是一个整数),你得到 a * b == c
.
现在 b
可能在 [0,m]
之外,所以我们想取 b
和 m
中的最小值:
- 如果
b
大于m
,我们受限于m
,
- 如果
m
大于 b
,我们受限于 a * b <= c
。
所以最后,你的函数应该是:
function doMath($cost, $max, $multiplier)
{
$div = min($multiplier, floor($max/$cost));
return array($cost, $div * $cost, $div);
}
不太确定将此标题设置为什么,或者甚至要搜索什么。所以我只问这个问题,希望我不会得到太多反对票。
我正在尝试找到最简单的方法来根据两个固定数字找到最大可能的数字。
例如:
我最多可以乘以 18(第一个数字)。但不要超过结果数字,比如 100(第二个数字)。
2 x 18 = 36
5 x 18 = 90
但如果第一个数字较大,则第二个数字需要小于 18,如下所示:
11 x 9 = 99
16 x 6 = 96
这里我会选择11,因为即使第二个数字只有9,结果也是最高的。第二个数字可以是任何数字,只要它是 18 或更低。第一个数字可以是任何数字,只要答案保持在 100 以下即可。明白我的意思吗?
所以我的问题是,如何在不使用开关、if/then 语句或一堆循环的情况下将其写入 php?是否有一些我不知道的数学运算符可以处理这类事情?
谢谢。
编辑:
我现在使用的代码是:
function doMath($cost, $max, $multiplier) {
do {
$temp = $cost * $multiplier;
if ($temp > $max) { --$multiplier; }
} while ($temp > $max);
return array($cost, $temp, $multiplier);
}
如果我们看一下 11 * 9 = 99 的例子,
$result = doMath(11, 100, 18);
会return,
$cost = 11,$temp = 99,$multiplier = 9
希望有一种更简单的方法,这样我就不需要使用循环了,因为我需要检查的数字太多了。
如果我没理解错的话,你正在寻找 the floor function, combining it with the min function。
较大的数字 c
和较小的数字 a
都是问题的一部分,并且您想在 [0, m]
范围内找到一个数字 b
这样的a * b
最大,同时保持小于(严格)小于 c
。
在你的例子中,100/18 = 5.55555,这意味着 18*5 小于 100,而 18*6 大于 100。
因为 floor
得到了浮点数的整数部分,所以 $b = floor($c/$a)
做你想做的。当 a
除 c
时(也就是说,c/a
已经是一个整数),你得到 a * b == c
.
现在 b
可能在 [0,m]
之外,所以我们想取 b
和 m
中的最小值:
- 如果
b
大于m
,我们受限于m
, - 如果
m
大于b
,我们受限于a * b <= c
。
所以最后,你的函数应该是:
function doMath($cost, $max, $multiplier)
{
$div = min($multiplier, floor($max/$cost));
return array($cost, $div * $cost, $div);
}