<?php
define("MAX_NUM",30);
define("SMALL_NUM",5);
$allChar[MAX_NUM] = array();//create string
for($i = 0;$i<MAX_NUM;$i++)
{
$allChar[$i] = chr(rand(11, 100));
}
$arr_tmp = array();
$n =0;
for($i=0;$i < MAX_NUM;$i++)
  for($j=0;$j < MAX_NUM;$j++)
    for($k=0;$k < MAX_NUM;$k++)
      for($l=0;$l < MAX_NUM;$l++)
       for($m=0;$m < MAX_NUM;$m++)
       {
       $str = $allChar[$i].$allChar[$j].$allChar[$k].$allChar[$l].$allChar[$m];
       $flag = true;
       for($a = 0;$a < count($arr_tmp);$a++)
       {
       if($arr_tmp[$a] == $str ) 
       {
       $flag = false;
       break;
       }
       }
       if($flag) 
       {
       $arr_tmp[$n++] = $str;
         echo "字符串 ".$n." is :".$str." <br>";
        }
}
?>
比较笨的方法,来接点分

解决方案 »

  1.   

    <?php
    $data = "abcdefghijk"; //测试串,长度任意。越长则运行时间越长
    preg_match_all("/./",$data,$r); //按字符分裂成数组
    $ar = $r[0];/**
    递归函数,参数
    $ar 数据数组
    $m  组合串的长度
    $s  工作变量,用于缓存中间量
    **/
    function foo($ar,$m,$s='') {
      if($m == 0) {
        echo "$s<br>"; //如果长度够了则输出结果
      }else {
        for($i=0;$i<count($ar);$i++) {
          foo($ar,$m-1,$s.$ar[$i]); //递归
        }
      }
    }foo($ar,5);
    ?>
      

  2.   

    给你段真正的变态的代码<?php$str = "abcdefghijk";
    define('COUNT', 4);$root = "";
    $dom = new Node($str[0], 1, &$root);
    $dom->execute(substr($str, 1));class Node{
    var $char;
    var $level;
    var $parent;    function Node($char, $level, &$parent){
            $this->char = $char;
            $this->level = $level;
            $this->parent = &$parent;
        }    function execute($str){
         if($this->level==COUNT){
         echo $this->doPath()."<br>";
         return ;
         }
            $length = strlen($str);
            for($i=0; $i<$length; $i++){
             $obj = new Node($str[$i], $this->level+1, $this);
             $obj->execute(substr($str, $i+1));
            }
        }    function doPath(){
            return $this->level==1? $this->char: $this->parent->doPath().$this->char;
        }
    }?>
      

  3.   

    非常感谢,楼上几位的回答,尤其是唠叨的,代码精简,正是我想要的,只是位数多了就会死掉。abaowu(钳工) 方法比较原始,谢谢参与。变态的代码有问题,不能列出所有组合,你试着运行一下唠叨的代码看看。唠叨的代码是不是可以改进呢?
    大家继续发表一下意见。
    也容我再想想。
      

  4.   

    哦, 7456,竟然忘了根节点循环了, 呵呵, 没事, 再来
    <?php$str = "abcdefghijk";
    define('COUNT', 4);$dom = new Root($str);
    $dom->execute();class Root{ var $str = ''; function Root($str){
            $this->str = $str;
    } function execute(){
    $i = 0;
    while($this->str[$i]!=null){
            $dom = new Node($this->str[$i++], 1, $this);
            $dom->execute(substr($this->str, $i));
            }
    }}class Node{
    var $char;
    var $level;
    var $parent;    function Node($char, $level, &$parent){
            $this->char = $char;
            $this->level = $level;
            $this->parent = &$parent;
        }    function execute($str){
         if($this->level==COUNT){
         echo $this->doPath()."<br>";
         return ;
         }
            $length = strlen($str);
            for($i=0; $i<$length; $i++){
             $obj = new Node($str[$i], $this->level+1, $this);
             $obj->execute(substr($str, $i+1));
            }
        }    function doPath(){
            return $this->level==1? $this->char: $this->parent->doPath().$this->char;
        }
    }?>
      

  5.   

    上面的忘了加随机的排序组合了, 下面的就和体育彩票的一样了.真的是觉得自己越来越变态了, 代码虽然有够垃圾, 但这种方法是替换递归的一个好办法
    <?php$str = "abcdedef";
    define('COUNT', 4);$dom = new Root($str);
    $dom->execute();class Root{ var $str = ''; function Root($str){
            $this->str = $str;
    } function execute(){
    $i = 0;
    while($this->str[$i]!=null){
            $dom = new Node($this->str[$i++], 1, $this);
            $dom->execute(substr($this->str, $i));
            }
    }}class Node{
    var $char;
    var $level;
    var $parent;    function Node($char, $level, &$parent){
            $this->char = $char;
            $this->level = $level;
            $this->parent = &$parent;
        }    function execute($str){
         if($this->level==COUNT){
         return NodeHelp::sort($this->doPath());
         }
            $length = strlen($str);
            for($i=0; $i<$length; $i++){
             $obj = new Node($str[$i], $this->level+1, $this);
             $obj->execute(substr($str, $i+1));
            }
        }    function doPath(){
            return $this->level==1? $this->char: $this->parent->doPath().$this->char;
        }
    }class NodeHelp{ function sort($str){
            $i=1;
            $data = array($str[0]);
            while($str[$i]!=null){
                $data = NodeHelp::sortHelp($str[$i],$data);
                $i++;
            }
            NodeHelp::write($data);
    } function sortHelp($char, $data){
    $result = array();
            foreach($data as $d){
             $length = strlen($d);
             for($i=0; $i<=$length; $i++){
                    $result[] = substr($d, 0, $i).$char.substr($d, $i);
             }
            }
            return $result;
    } function write($data){
            foreach($data as $d)
             echo $d."-";
            echo "--------END<br>";
    }}?>
      

  6.   

    变态给出的还是不对,你先看看唠叨的那个,能显示位数少一点的组合,多了就不行了。
    你的是从abcd开始的,并没有aaaa,aaab,aaac,aaad之类的,要是彩票的话这些是允许出现的。
      

  7.   

    呵呵,我还真没有见过可以重复的这种彩票.其实唠叨的方法可以在正常的时间内,显示组合远比你想象的要多.你把所有的echo的地方都去掉,会快很多.
      

  8.   

    aaaa,aaab,aaac,aaad这些没有重复。