一:基础知识
1.排列公式Anm是指从n个元素取m个进行排列(即排序).
操作步骤:先从n个元素中选取m个元素,再进行排序.(一共有Anm种排列)2.组合公式Cnm是指从n个元素取m个不进行排列(即不排序)
操作步骤:只需从n个元素中选取m个元素就好,不须要排序.(一共有Cnm中取法)
3.例如 从A、B、C 3个字母取2个字母进行排列,有6种:AB AC BA BC CA CB
(字母顺序不同,是不同的排列)
而将A、B、C 3个字母取2个字母进行组合,只有3种:AB AC BC(只与含有的元素有关,与顺序无关,即AB与BA是同种组合)
或移步摆渡---例题很经典,可以研究一下。。。。
A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!
C(n,m)=A(n,m)/m!;C(n,m)=C(n,n-m)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author MohnSnow
* @time 2015年5月20日 上午10:39:17
*
*/
public class Test {
//将NUM设置为待排列数组的长度即实现全排列
private static int NUM = 3;
private static int ACCOUNT = 0;
/**
* 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列,类似于DFS算法
*
* @param datas
* @param target
*/
private static void sort(List datas, List target) {
if (target.size() == NUM) {
for (Object obj : target)
System.out.print(obj);
System.out.print(" "+ ++ACCOUNT );
System.out.println();
return;//退出此次循环
}
for (int i = 0; i < datas.size(); i++) {
List newDatas = new ArrayList(datas);
List newTarget = new ArrayList(target);
newTarget.add(newDatas.get(i));
newDatas.remove(i);
System.out.println("newDatas:"+newDatas);
System.out.println("newTarget:"+newTarget);
System.out.println("循环一次,此时i值为"+i);
sort(newDatas, newTarget);
}
}
public static void main(String[] args) {
String[] datas = new String[] { "a", "b", "c", "d" };
System.out.println("字符为:"+Arrays.asList(datas)+",选择字符个数为:"+NUM);
//System.out.println(datas);
sort(Arrays.asList(datas), new ArrayList());
}
}
/**
* @author MohnSnow
* @time 2015年5月20日 上午11:31:45
* @title 只是int范围的时候
*/
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class Test_A {
/**
* @param args
*/
private static int A(int a,int b){
int A_return = 1,i;
int c = a-b+1;
for(i = c;i <= a;i++){
A_return *=i;
}
return A_return;
}
private static int C(int a,int b){
if(b>a/2){
int a_temp = a;
int temp = a-b;
C(a_temp,temp);
}
int C_return = 1,up_temp =1,down_temp=1;
for(int i = 1;i <= b;i++){
up_temp *= a--;
down_temp *= i;
//System.out.println(""+up_temp);
}
C_return = up_temp/down_temp;
return C_return;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a_input = in.nextInt();
int b_input = in.nextInt();
System.out.println("A(a,b):"+A(a_input,b_input)+",C(a,b):"+C(a_input,b_input));
}
}
/**
* @author MohnSnow
* @time 2015年5月20日 上午11:31:45
* @title 不只是int范围的时候
*/
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Scanner;
public class TestBigInteger {
/**
* @param args
*/
private static BigInteger A(BigInteger a,BigInteger b){
BigInteger A_return = BigInteger.ONE;
//System.out.println(A_return);
BigInteger c = a.subtract(b).add(BigInteger.ONE);//c= a-b+1
//System.out.println(c);
for(BigInteger i = c;i.compareTo(a) ==0 || i.compareTo(a) == -1;i = i.add(BigInteger.ONE)){
//System.out.println(i);
A_return = A_return.multiply(i);
}
return A_return;
}
private static BigInteger C(BigInteger a,BigInteger b){
BigInteger two = new BigInteger("2");
if(b.compareTo(a.divide(two)) == 1){// b>a/2
//System.out.println("b > a/2");
BigInteger a_temp = a;
BigInteger temp = a.subtract(b);//a-b
//System.out.println("a-b = "+temp);
return C(a_temp,temp);
}
BigInteger C_return = BigInteger.ONE,
up_temp =BigInteger.ONE,
down_temp=BigInteger.ONE;
for(BigInteger i = BigInteger.ONE;i.compareTo(b) != 1;a = a.subtract(BigInteger.ONE),i = i.add(BigInteger.ONE)){
up_temp = up_temp.multiply(a);
down_temp = down_temp.multiply(i);
System.out.println(i + "a: "+a+"----"+"i: "+i);
}
C_return = up_temp.divide(down_temp);
return C_return;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
BigInteger a_input = in.nextBigInteger();
BigInteger b_input = in.nextBigInteger();
System.out.println("A(a,b):"+A(a_input,b_input)+",C(a,b):"+C(a_input,b_input));
}
}