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