专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

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

发布时间:2011-06-28 14:44:34 文章来源:www.iduyao.cn 采编人员:星星草
新手请教一个关于彩票的组合算法和绝对序号定位
新手请教一个关于彩票的组合算法和绝对序号定位

比如以最常见的双色球为例子,不考虑篮球的情况。红色球在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;
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: