问题描述
1,32位WIN平台,JDK1.6,在上述环境下一个JVM实际最多可利多少内存2,15选5是一种数字彩票游戏,即从15个数字中随便选择不重复的5个数字组成一注彩票号码进行投注。一共3003注号码,从最小的一注号码到最大的一注号码依次是:序号 彩票号码1 01 02 03 04 052 01 02 03 04 06 ······10 01 02 03 04 1411 01 02 03 04 1512 01 02 03 05 06 ······3003 11 12 13 14 15求算法:给出任意一注号码,求出序号.例输入"01 02 03 05 06"号码,输出数字12问题补充高手 求解答!!!!!!!!!!!
解决方案
1、2G2、一种最土的办法 int index = 0; Map<String, Integer> map = new HashMap<String, Integer>(); for (int i = 1; i <= 11; i++) { for (int j = i + 1; j <= 12; j++) { for (int k = j + 1; k <= 13; k++) { for (int l = k + 1; l <= 14; l++) { for (int m = l + 1; m <= 15; m++) { map.put("" + i + j + k + l + m, ++index); } } } } }
解决方案二:
这是个排列组合的问题,用数学的方法就能搞定,可能有更简便的解决方法public static final int MAX = 15;public static void main(String[] args) {//a[0]为填充int[] a = { 0, 1, 2, 3, 5, 6 };System.out.println(index(a));}public static long index(int[] a) {long index = 1;for (int i = 0, len = a.length - 1; i < len; i++) {int front = a[i + 1] - a[i] - 1;int n = len - i - 1;for (int k = 1; k <= front; k++) {int m = MAX - a[i] - k;index += c(n, m);}}return index;}//求c(n,m)public static long c(int n, int m) {if (m <= 0) {return 0;}long temp1 = 1;for (int i = m, j = 0; j < n; j++, i--) {temp1 *= i;}long temp2 = 1;for (int i = n; i > 0; i--) {temp2 *= i;}return temp1 / temp2;}
解决方案三:
放到map<组合,序号>里