2 回答
TA贡献1804条经验 获得超8个赞
您需要从最大的值开始兑换,直到您的金额小于最大的纸币(例如 2000)。然后你用更低的音符(例如500)做同样的事情,然后再用更低的音符。当金额小于最低值(例如 20)时,您无法兑换此金额。
所以:
我们从2270开始
我们检查最大的纸币 - 它是 2000。
现在我们知道我们有 2000 和 270 (2270 - 2000) 休息
现在我们再次检查最大值 - 它是 200
所以我们有 2000、200 和 70 (270 - 200) 休息
现在最大的不可能是 50
所以我们有 2000, 200, 50 和 20 (70 - 50) 休息
现在最大的是 20,我们有 2000、200、50、20,其余的是 0
由于休息比最低音符小,所以我们可以停止检查。
如果 rest 为 0,我们知道我们可以交换,如果 rest 大于 0,则我们不能。此外,我们还有可用于交换的票据列表(2000、200、50、20)。
function checkDenomination($amount){
$notes = array(2000,500,100,50,20); //it's easier if they are reversed
$smallestNote = 20;
$result = [];
while($amount >= $smallestNote) { //we will repeat until we can exchange
foreach($notes as $note) {
if ($amount >= $note) { //we check for largest value we can exchange
$result[] = $note;
$amount -= $note; //as we have hit, we can deduct it from amount;
break;
}
}
}
return ($amount > 0) ? false : $result; //return false if we cannot exchange this amount or array with notes we can exchange for full amount
}
var_dump(checkDenomination(100));
var_dump(checkDenomination(23424));
var_dump(checkDenomination(25000));
var_dump(checkDenomination(222));
TA贡献1858条经验 获得超8个赞
尝试两个模块化部门
function validateCurrency($amount)
{
$requestdAmount = $amount;
$valueUnder = 0;
$notes = array(20, 50,100,500,2000);
$is_allowed = 0;
if(in_array($amount, $notes)){
return $is_allowed = 1;
}
$numOccurance = ceil($amount/$notes[0]);
$arraySums = [];
foreach ($notes as $key => $value) {
for ($i=1; $i <= $numOccurance; $i++) {
if($value * $i == $amount) {
return $is_allowed = 1;
}
$arraySums[$key][] = $value * $i;
}
}
for ($i=0; $i < count($arraySums); $i++) {
for ($j=$i+1; $j < count($arraySums); $j++) {
foreach ($arraySums[$i] as $key => $value) {
foreach ($arraySums[$j] as $key2 => $toBeMul) {
if($value+$toBeMul == $amount) {
return $is_allowed = 1;
}
}
}
}
}
return $is_allowed;
}
// Driver Code
$amount = 40;
$is_allowed = validateCurrency($amount);
echo $is_allowed;
die();
它会工作
- 2 回答
- 0 关注
- 125 浏览
添加回答
举报