9:一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。
售货员希望用数目最少的硬币个数找给小孩。假设提供了数目不限的面值为
2 5美分、1 0美分、5美分、及1美分的硬币,写一个算法让售货员用最少的硬币个数找给小孩
- <?php
- /*
- 9:一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。
- 售货员希望用数目最少的硬币个数找给小孩。假设提供了数目不限的面值为
- 2 5美分、1 0美分、5美分、及1美分的硬币,写一个算法让售货员用最少的硬币个数找给小孩
- *系统环境:windows/linux
- *编译环境:php4/php5
- *输入参数:存放在in.txt,多个参数时空格分隔
- 参数1是一个小数,表示小孩买的糖的价格,必须小于1
- 例如0.36
- 输出:out.txt
- */
- $params=getParams(1);
- $argv0=trim($params[0]);
- //检查参数1
- if(!is_numeric($argv0))
- {
- error_msg("params 1 must be a numbers");
- }
- if($argv0 > 1)
- {
- error_msg("params 1 must be a float < 1");
- }
- $onedoll=100;//1美元=100美分
- $coins=array(25,10,5,1);
- $payback=$onedoll-$argv0*$onedoll;
- $paybackCoins=array();
- while($payback > 0)
- {
- foreach($coins as $coin)
- {
- //每次都从最大币值开始循环
- if($payback >= $coin)
- {
- $paybackCoins[]=$coin;
- $payback-=$coin;
- break;
- }
- }
- }
- //输出结果
- output("payback with lest coins:".join(",",$paybackCoins),true);
- error_msg("execute success");
- /*
- 从in.txt里读取参数
- */
- function getParams($paramNum)
- {
- $in=file_get_contents("in.txt");
- if($in===FALSE){
- error_msg("cannot read in.txt,please check in.txt exists\n");
- }
- $in=preg_replace("/(\s+)/i", " ", $in);
- //多个参数时,按照空格分隔
- $parms=split(" ",trim($in));
- if($parms===FALSE)
- {
- error_msg("cannot get param from in.txt\n");
- }
- if(count($parms) < $paramNum)
- {
- error_msg("it needs $paramNum params\n");
- }
- return $parms;
- }
- /*
- 把结果输出到输出文件里
- 当isClean=true时清空out.txt
- */
- function output($msg,$isClean=false)
- {
- if($isClean)
- {
- $handle = fopen('out.txt', 'w');
- fclose($handle);
- }
- error_log($msg."\n", 3, "out.txt");
- }
- /*
- 输入错误信息
- 如果$is_exit表示输入信息后退出
- */
- function error_msg($msg,$is_exit=true)
- {
- if($is_exit)
- die($msg."\n");
- else
- echo $msg."\n";
- }
- ?>