一个组合问题,彩票行业,假如我现在买了一张双色球复式:02,04,05,10,12,16,18,22,24,26,28,31,33+02,04,07,12 前面是红球号码,加好后面是篮球号码,现在的问题是,我要把这单复式拆成6+1形式的,也就是6个红球加1个篮球,拆出来的单子不能有重复的,号码没得顺序要求,实现难点是如何把拆出来的每注组合显示出来,计算能拆多少份(这个稍容易点),js代码实现。
   整了好长时间,搞定不了,求高手指导,有例子,代码不胜感激,也可以谈谈实现思路, 多谢了!!!
    

解决方案 »

  1.   

    看下是不是你要的
    <script type="text/javascript">
    <!--
    var h = "02,04,05,10,12,16,18,22,24,26,28,31,33".split(",");
    var l = "02,04,07,12".split(",");
    document.write(GetCount(h.length, 6)*GetCount(l.length, 1)+"个<br/>");var kk = GetCountList(h, 6);
    var jj = GetCountList(l, 1)for (var i=0; i<kk.length; i++) {
    for (var j=0; j<jj.length; j++) {
    document.write(kk[i]+"+"+jj[j]+"<br/>");
    }
    }function GetCount(buyNum, perNum) {
    if (perNum == buyNum) return 1;
    if (perNum > buyNum) {
    alert("后者必须比前者小!");
    return 0;
    } else if (perNum <= 0) {
    alert("后者不能小于0!");
    return 0;
    } // 这3行能提高一点效率,并降低一部分溢出的可能  
    var diff = buyNum - perNum;
    if (diff > perNum) perNum = diff;
    var result = 1;
    var i;
    for (i = perNum + 1; i <= buyNum; i++) {
    result *= i;
    }
    for (i = 1; i <= buyNum - perNum; i++) {
    result /= i;
    }
    return result;
    /* 
     8个号码选7=   8注 
     9个号码选7=  36注 
    10个号码选7= 120注 
    11个号码选7= 330注 
    12个号码选7= 792注 
    */
    }
    function GetCountList(arr, s) {
    //alert("arr:"+arr+"\ns:"+s);
    var l_ret, l_item, item, i, tmp, l_arrTmp1;
    if (s < 1) {
    alert("选择个数不能小于1!");
    return [];
    }
    if (arr == null || arr.length == 0 || arr.length < s) {
    alert("数组不能为空 或 小于必选个数!");
    return [];
    }
    //alert(arr.length == s);
    if (arr.length == s) { //region 数组长度等于s时,直接返回1个组合 
    l_ret = new Array();
    l_item = new Array();
    for (item in arr) {
    l_item[l_item.length] = arr[item];
    }
    l_ret[l_ret.length] = l_item;
    return l_ret;
    }
    //alert(s==1);
    if (s==1) { //region 从数组中查找1个数字的组合,直接把数组各元素返回 
    l_ret = new Array();
    for (item in arr) {
    l_item = new Array();
    l_item[l_item.length] = arr[item];
    l_ret[l_ret.length] = l_item;
    } //endregion 
    return l_ret;
    }
    var l_arrTmp = new Array();
    for (i=0; i<arr.length-s+1; i++) { // 后面的数任意取s-1个 
    tmp = GetArray(arr, i);
    l_arrTmp1 = GetCountList(tmp, s - 1);
    for (item in l_arrTmp1) {
    l_arrTmp1[item].unshift(arr[i]);
    l_arrTmp[l_arrTmp.length] = l_arrTmp1[item];
    }
    }
    return l_arrTmp;
    }/// <summary> 
    /// 把arr数组中,位置为beg之后的元素全部放入一个新数组返回(不包含beg元素) 
    /// </summary> 
    /// <param name="arr"></param> 
    /// <param name="beg"></param> 
    /// <returns></returns> 
    function GetArray(arr, beg) 
    {
    return arr.slice(beg+1); 
    }
    //-->
    </script>参考http://blog.csdn.net/youbl/archive/2008/12/12/3505038.aspx