private void mn(int m, int n) { if(m < n) throw new IllegalArgumentException("Error m < n"); int[] array = new int[m]; for(int i = 0; i < m; i ++) array[i] = i + 1; BitSet bs = new BitSet(m); for(int i = 0; i < n; i++) bs.set(i, true); do { printAll(array, bs); }while(moveNext(bs, m));
} private boolean moveNext(BitSet bs, int m) { int start = -1; while(start < m) if(bs.get(++start)) break; if(start >= m) return false;
int end = start; while(end < m) if(!bs.get(++end)) break; if(end >= m) return false; for(int i = start; i < end; i++) bs.set(i, false); for(int i = 0; i < end - start - 1; i++) bs.set(i); bs.set(end); return true; } private void printAll(int[] array, BitSet bs) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < array.length; i++) if(bs.get(i)) sb.append(array[i]).append(','); sb.setLength(sb.length() - 1); System.out.println(sb); } public static void main(String[] args) throws Exception { new TestA().mn(8, 3); } 这个是组合,排列可以在选取出来后再计算一次这个数列中的所有可能
if(m < n)
throw new IllegalArgumentException("Error m < n");
int[] array = new int[m];
for(int i = 0; i < m; i ++)
array[i] = i + 1;
BitSet bs = new BitSet(m);
for(int i = 0; i < n; i++)
bs.set(i, true);
do {
printAll(array, bs);
}while(moveNext(bs, m));
}
private boolean moveNext(BitSet bs, int m) {
int start = -1;
while(start < m)
if(bs.get(++start))
break;
if(start >= m)
return false;
int end = start;
while(end < m)
if(!bs.get(++end))
break;
if(end >= m)
return false;
for(int i = start; i < end; i++)
bs.set(i, false);
for(int i = 0; i < end - start - 1; i++)
bs.set(i);
bs.set(end);
return true;
}
private void printAll(int[] array, BitSet bs) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < array.length; i++)
if(bs.get(i))
sb.append(array[i]).append(',');
sb.setLength(sb.length() - 1);
System.out.println(sb);
}
public static void main(String[] args) throws Exception {
new TestA().mn(8, 3);
}
这个是组合,排列可以在选取出来后再计算一次这个数列中的所有可能