一个小小的算法问题

bing15 2015-04-07 10:17:50
比如:我们充值话费的时候,充大于10元送1元话费,充大于50元送5元话费。

那么此时,我充值的是51元话费,我怎么去命中的是50元送5元话费,而此时不再命中大于10元送1元话费了。

老大,帮我看下吧

$a = array('50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
$flag = 0;
foreach($a as $k=>$v){
if($s >=$k){
$flag=$v;
}
}
return $flag;
}
echo test($s,$a);
...全文
127 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-04-07
  • 打赏
  • 举报
回复
规则都不好好的制定
$a = array('40'=>'3','50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
  $flag = 0;
  foreach($a as $k=>$v){
    if($s >=$k){
      $flag = max($flag, $v); //取大值
    }
  }
  return $flag;
}
echo test($s,$a);
傲雪星枫 2015-04-07
  • 打赏
  • 举报
回复
這樣就可以了。

$a = array('40'=>'3','50'=>'5','10'=>'1');
$s = 51;

arsort($a,SORT_NUMERIC); // 先按key大小排序

function test($s,$a){
    foreach($a as $k=>$v){
        if($s >=$k){
            return $v;
        }
    }
    return 0;
}
echo test($s,$a); // 5
bing15 2015-04-07
  • 打赏
  • 举报
回复
引用 6 楼 qq_16097601 的回复:
$a = array('40'=>'3','50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
    $flag = 0;
    foreach($a as $k=>$v){
        if($s >=$k){
                if($flag<$v)           
                $flag=$v;
            
        }
    }
    return $flag;
}
echo test($s,$a);
OK,这样就解决了。3Q
ChanKalam 2015-04-07
  • 打赏
  • 举报
回复
$a = array('40'=>'3','50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
    $flag = 0;
    foreach($a as $k=>$v){
        if($s >=$k){
                if($flag<$v)           
                $flag=$v;
            
        }
    }
    return $flag;
}
echo test($s,$a);
ChanKalam 2015-04-07
  • 打赏
  • 举报
回复
引用 3 楼 bing15 的回复:
如果$a 换成 $a = array('40'=>'3','50'=>'5','10'=>'1'); 那么结果就是3了,这个时候51比50要大,应该是5啊

[code=php]$a = array('50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
    $flag = 0;
    foreach($a as $k=>$v){
        if($s >=$k){
if($flag<$v)           
 $flag=$v;
           
        }
    }
    return $flag;
}
echo test($s,$a);
[/code] 数组是排列不规则的话就这样
ChanKalam 2015-04-07
  • 打赏
  • 举报
回复
你在foreach里面赋值的话,如果数组是以金额从大到小排列,那第一次检测到符合条件的时候就应该返回,即同1#,否则会被接下来的符合条件的小数额覆盖。 或者把数组从小到大排列,但是这样效率相对低一点,因为这样要把数组从头到尾判断完。
bing15 2015-04-07
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
$a = array('50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
    $flag = 0;
    foreach($a as $k=>$v){
        if($s >=$k){
            $flag=$v;
            break; //这样比较规范(一个模块只有一个出口)
        }
    }
    return $flag;
}
echo test($s,$a);
如果$a 换成 $a = array('40'=>'3','50'=>'5','10'=>'1'); 那么结果就是3了,这个时候51比50要大,应该是5啊
xuzuning 2015-04-07
  • 打赏
  • 举报
回复
$a = array('50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
    $flag = 0;
    foreach($a as $k=>$v){
        if($s >=$k){
            $flag=$v;
            break; //这样比较规范(一个模块只有一个出口)
        }
    }
    return $flag;
}
echo test($s,$a);
xuzuning 2015-04-07
  • 打赏
  • 举报
回复
$a = array('50'=>'5','10'=>'1');
$s = 51;
function test($s,$a){
    $flag = 0;
    foreach($a as $k=>$v){
        if($s >=$k){
            return $v; //注意这里
        }
    }
    return $flag;
}
echo test($s,$a);

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧