JAVA基础练习,枚举出彩票36选7的所有组合,并把它们保存在文本文件中,要求,每个文件最多保存60万组。
为什么有这样的要求?因为36选7有 50,086,080 个组合,如果把它保存在一个文件中,有1G多,打都打不开。
彩票36选7并不仅仅是组合,因为36选7还有一个特别号码。
01 02 03 04 05 06 07
01 02 03 04 05 07 0601 02 03 04 06 07 05
01 02 03 05 06 07 04
01 02 04 05 06 07 03
01 03 04 05 06 07 02
02 03 04 05 06 07 01
因此我们要先求出 1-36 的 8,347,680 种组合,再把每一个组合的元素互换6次得到彩票36选7的组合。也就是说分成了两个步骤。
package my.lottery.groups;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
/***************************
*
* 这个类的代码虽然有100多行,但其实真在实现组合的代码就几行.
* 而且每次获取的是一个组合,方便对组合数据的后续操作.
*
* 组合指:集合A中有n个元素,从n个元素中取m个,无排序的组成一组。其中任意一组叫做从n个元素中取m个的一个组合。
* 例如:像彩票36选7。但是36选7还有一个特别号.所以36选7的组合总数应该是:
* C(36,7)*P(6,1) = 36*35*34*33*32*31*30/7/6/5/4/3/2/1*6 = 50086080
* System.out.println((36L*35*34*33*32*31*30)/(7*6*5*4*3*2*1)*6);
*
* 这里使用字典排序生成组合,字典排序就是后一个组合比前一个组合大,以6选3为例,可以产生20个组合:
* {1,2,3} < {1,2,4} < {1,2,5} < {1,2,6} < {1,3,4} < {1,3,5} ... < {4,5,6}
*
* 一个组合要有以下成员:
* 1.要进行组合的集合coll......如{1,2,3,4,5,6}
* 2.集合A的元素个数n.........这里n=6
* 3.取m个元素生成的组合group...如{1,2,3}
* 4.每个组合的长度m..........这里m=3
* 5.能产生的组合总数count.....公式C(n,m) = P(n,m)/m! count = 6*5*4/3/2/1 = 20
* 6.最小的组合start.........集合的前m位{1,2,3}...最小组合也是字典排序的开始