为了账号安全,请及时绑定邮箱和手机立即绑定

在 PHP 中允许使用可用的国家/地区面额检查最终金额

在 PHP 中允许使用可用的国家/地区面额检查最终金额

PHP
缥缈止盈 2021-10-15 10:18:26
需要制作自定义功能来检查可用面额的金额。我做的代码:$amount = 100;$notes_aval = array(20,50,100,500,2000);//available currency notes    $is_allowed = 0; //not allowed    foreach($notes_aval as $note){         if (fmod($amount,$note) == 0) {         $is_allowed = 1;//allowed          }       }echo $is_allowed;但这并不适用于所有情况。考试:我有面额 = array (20,50); 数量为 90 是不允许的,但应该允许 20*2 + 50*1 = 90在面额 = array (20,50) 的示例中,如果金额 1110 应该可以接受,则 1110 = 20*53 + 50*1
查看完整描述

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));


查看完整回答
反对 回复 2021-10-15
?
猛跑小猪

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();

它会工作


查看完整回答
反对 回复 2021-10-15
  • 2 回答
  • 0 关注
  • 125 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信