nav-left cat-right
cat-right

编程的乐趣

今天公司财务要开一些发票,内容是纵贯线演唱会门票,但是要拆开来开,比如总价是13300,必须按380、580、800、1280、1680这五种形式的组合,起始就是通过这样的等式($a*380+$b*580+$c*800+$d*1280+$e*1680)==$total=13300来求出abcde的值,其中abcde必须是大于或者等于0的整数,他们在那用计算器算了半天没算出来问我,我想到用php的循环来算,结果就有了下面的这一段代码,还真好用 光是13300就有100多种组合方法,这还是怕脚本超市把循环限制了一下次数。忽然更加感觉到计算机的伟大,如果是人工来算,挨个循环试,找到一种方案也可能会好用半天时间。

<?php
$j=0;
$total=13300;
for($a=0;$a<40;$a++){
    for($b=0;$b<30;$b++){
        for($c=0;$c<20;$c++){
            for($d=0;$d<20;$d++){
                for($e=0;$e<20;$e++){
                    if(($a*380+$b*580+$c*800+$d*1280+$e*1680)==$total) {
                        echo $j+1;
                        echo '<font color=red>种方案 a'.$a.'-b'.$b.'-c'.$c.'-d'.$d.'-e'.$e.'</font><br />';
                        $j++;
                    }
                }
            }
        }
    }
}
?>

2 条评论 »

  1. avatar nav-left

    选计算一下可以减小问题的规模..

    <?php
    $total = 13300;
    $p = array(380,580,800,1280,1680);
    for($i=0;$i<5;$i++)
    {
    $a{$i} = ceil($total/$p[$i]);
    }

    for($i=1;$i<=$a[4];$i++)
    {
    for($j=1;$j<=$a[3];$j++)
    for($k=1;$k<=$a[2];$k++)
    for($x=1;$x<=$a[1];$x++)
    for($y=1;$y

    nav-left
  2. avatar nav-left

    完全正确,我当时就像快速解决问题,没想那么多,确实这样就把循环次数固定了。

    nav-left

这篇文章上的评论 RSS feed TrackBack URL

留下评论