首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

新手请问一个关于彩票的组合算法和绝对序号定位

2012-03-23 
新手请教一个关于彩票的组合算法和绝对序号定位新手请教一个关于彩票的组合算法和绝对序号定位比如以最常

新手请教一个关于彩票的组合算法和绝对序号定位
新手请教一个关于彩票的组合算法和绝对序号定位

比如以最常见的双色球为例子,不考虑篮球的情况。红色球在1-33里选择,开奖数为6个

第一注为 1 2 3 4 5 6 
第二注为 1 2 3 4 5 7
...
...
以此类推,直到最后一注
28 29 30 31 32 33

一共有组合 6 33!
  C = ---------- =1107568 种组合
  33 6!(33-6)!

如果加上篮球就是 1107568×16=17721088 注组合。


问题就是: 假设有一组号为: 5 12 15 19 23 33 +10

如果不考虑篮球的情况下:如何确定5 12 15 19 23 33 在组合1107568注中的绝对序号?

如果不考虑篮球的情况下:如何确定5 12 15 19 23 33 +10 在组合117721088 注中的绝对序号?


小弟是编程新手,不会写算法,那位ggjj给实现一下算法,讲解一下思路。用C、VB都可以。谢谢!!



[解决办法]
其实就是计算第一种情况,第二种就好办


对于一组号 5 12 15 19 23 33
分开讨论:先看第一个数:是5, 那么前面就有4组数去安排完了, 序号为:
C(32,5) + C(31,5) + C(30,5)+C(29,5)

然后看第二个数是12,
那么前面的从6-》11排完了,多少呢?
以第二个数是6举例:(前2个数是5 6 。。。)
序号个数是:从7-》33选4个数,C(27,4)
7的话,就是C(26,4)
9的话:C(25,4), 10的话C(24,4),11的话C(23,4)
和为:C(25,4)+C(24,4)+C(23,4)


接着看第三个数是15,这就要计算5 12 13; 5 12 14开头的 2种情况:
C(20,3)+C(19,3)


然后看第四个数19, 这就要计算5 12 15 16;5 12 15 17;5 12 15 18开头的三组数的序号个数:
C(17,2)+C(16,2)+C(15,2)

接着看第五个数23,这就要计算5 12 15 19 20; 5 12 15 19 21;5 12 15 19 22;开头的三组数序号数,为:
C(13,1)+C(12,1)+C(11,1)

最后看第六个数33,计算5 12 15 19 23 24-》5 12 15 19 23 33的个数为10个


总序号数为:
C(32,5) + C(31,5) + C(30,5)+C(29,5) +
C(25,4)+C(24,4)+C(23,4)+
C(20,3)+C(19,3)+
C(17,2)+C(16,2)+C(15,2)+
C(13,1)+C(12,1)+C(11,1)+
10

把这段算法思想编程不难了, 依次提取输入的数字 5 12 19 23 33存入一个数组, 然后进行上述的组合运算即可


[解决办法]
做了算法:

C/C++ code
//彩票程序/*比如以最常见的双色球为例子,不考虑篮球的情况。红色球在1-33里选择,开奖数为6个第一注为 1 2 3 4 5 6第二注为 1 2 3 4 5 7......以此类推,直到最后一注28 29 30 31 32 33一共有组合    6        33!          C    =  ---------- =1107568  种组合              33      6!(33-6)!如果加上篮球就是 1107568×16=17721088 注组合。问题就是: 假设有一组号为:  5  12  15  19  23  33  +10如果不考虑篮球的情况下:如何确定5 12 15 19 23 33 在组合1107568注中的绝对序号?如果不考虑篮球的情况下:如何确定5 12 15 19 23 33 +10 在组合117721088 注中的绝对序号?*/#include <stdio.h>//#include <int comp(int m, int n){    if(m == n)        return 1;    if(n==1)        return m;    return comp(m-1, n)+comp(m-1,n-1);    /*    数学原理    Cn m=Cn-1m+Cn-1m-1    */}int main(){    int a=5, b=12, c=15, d=19, e=23, f=33;//这是红球的号,为 1 - 33    int blue = 10;//蓝球为1 - 16 任选一个!    //int a=1, b=2, c=3, d=4, e=7, f=8;    // 首先,必须是1<=a<b<c<d<e<f<=33    // 这里你自己保证!    int a1=a, b1=b, c1=c,d1=d, e1=e;    //做一份拷贝    int sum = 0;    int allRedCount = comp(33,6);    //printf("%d\n",allRedCount);//测试打印结果为1107568    if(a1>1)    {        sum += comp(34-a1,5);        a1--;    }    if(b1-a>1)    {        sum += comp(34-b1,4);        b1--;    }    if(c1-b>1)    {        sum += comp(34-c1,3);        c1--;    }    if(d1-c>1)    {        sum += comp(34-d1,2);        d1--;    }    if(e1-d>1)    {        sum += comp(34-e1,1);        e1--;    }    sum += f-e;    printf("%d %d %d %d %d %d 的绝对序号是%d\n",    a,b,c,d,e,f,sum);    printf("加上蓝球后, %d %d %d %d %d %d 的绝对序号是%d\n",    a,b,c,d,e,f,sum+allRedCount*(blue-1));    return 0;} 

热点排行
Bad Request.