面试算法---排列组合AC的实现
2015-05-20 09:55
453 查看
一:基础知识
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)
/**
* @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));
}
}
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));
}
}
相关文章推荐
- 关于数学中排列组合之组合算法实现
- 【转】JAVA实现排列组合算法
- C#实现排列组合算法
- C语言实现的排列组合问题的通用算法、解决方法
- 高效率的排列组合算法(java实现)
- 【LeetCode-面试算法经典-Java实现】【017-Letter Combinations of a Phone Number (电话号码上的单词组合)】
- 排列组合算法的递归实现
- 排列与组合的算法实现
- 排列组合算法实现
- 针对较大基数的排列组合算法Java实现类(n选m)
- 排列和组合算法 C语言经典实现
- js实现全排列组合算法
- c语言实现排列组合算法问题
- Python实现的简单排列组合算法示例
- VB.NET 排列组合算法实现
- java排列组合算法代码实现
- 高效率的排列组合算法--《编程珠矶》--python实现
- java 高效率的排列组合算法(java实现)
- 基于python快速实现排列组合算法
- JS实现的全排列组合算法示例