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、结果截图: