1、设计思想:
1、使用BigInteger,将所有值都设置为BigInteger型,用multiply表示*,用divide表示/;
2、设计一个函数,用来实现递归计算n!;
3、输入n,k,计算n!,k!,(n-k)!,C(n,k)的值
4、设计杨辉三角形,定义一个二维数组num[][];num[i][j]=num[i-1][j-1]+num[i-1][j];
5、设计一个函数,递归计算组合数,定义一个二维数组,C[k][n+1]=C[k-1][n]+C[k][n];
2、程序流程图:
1、递归计算n!的流程图
2、计算杨辉三角形
3、递归计算组合数
3、程序源代码:
import java.math.BigInteger;
import java.util.Scanner;// 信1605-2 20163483 袁亚琴public class Compute { private int n; public static BigInteger fac(int n)//计算n的阶乘 { if(n<0) System.out.println("n<0,date error"); if(n==0||n==1) return BigInteger.valueOf(1); //返回值为1 else return BigInteger.valueOf(n).multiply(fac(n-1));//返回n*(n-1),n不为0不为1则继续循环 } public static void main(String[] args) { int n=0,k=0; BigInteger x,y,z,m,l; /*Compute p1=new Compute(); Compute p2=new Compute(); Compute p3=new Compute(); Compute p4=new Compute(); Compute p5=new Compute(); p1.fac(n); p2.fac(k); p3.fac(n-k); p4.fac(k-1); p5.fac(n-k+1);*/ System.out.println("input an integer number(n):"); Scanner input=new Scanner(System.in); n=input.nextInt(); y=fac(n);//y=n! System.out.println(n+"!="+y); System.out.println("input another integer number(k):"); k=input.nextInt(); x=fac(k);//x=k! System.out.println(k+"!="+x); z=fac(n-k);//z=(n-k)! System.out.println("(n-k)!="+(n-k)+"!="+z); BigInteger C,C1,C2,res; res=x.multiply(z); C=y.divide(res); System.out.println("组合数C(n,k)=:"+C); m=fac(k-1); l=fac(n-k+1); res=m.multiply(l); C1=y.divide(res); C2=C.add(C1); System.out.println("组合数:C(n+1,k)=C(n,k-1)+C(n,k)="+C2); System.out.println("利用杨辉三角形计算组合数:C(n+1,k)=C(n,k-1)+C(n,k)"); int w=100; int num[][]=new int[w][w]; for(int i=0;i<w;i++) { for(int j=0;j<=i;j++) { if(j==0||i==j) { num[i][j]=1;//每行第一个数为1,当行数和列数相等时值为1 } else { num[i][j]=num[i-1][j-1]+num[i-1][j];//第i行j列数的值为第i-1行j-1列的值+第i-1行j列的值 } } } System.out.println("input an integer number(n):"); n=input.nextInt(); System.out.println("input another integer number(k):"); k=input.nextInt(); System.out.println("C(n+1,k)=C(n,k-1)+C(n,k)="+num[n][k]); }}
4、结果截图: