课下作业1-利用计算机计算组合数
1.程序设计思想
第一种用公式的方法求组合数,利用递归方法,求出阶乘,求出组合数的大小。
第二种是用递推的方法,递推的方法是由前往后递推,利用杨辉三角形找出规律,利用二元数组求出组合数的大小。
第三种是用递归函数的方法,由后往前调用递归公式,利用给出组合数公式,初始化值,求出组合数的大小
2.程序流程图
3.程序源代码
第一种方法:
//信1605-1 寇肖萌 20163446
import java.util.Scanner;
import java.lang.Math.*;
import java.math.BigInteger;
public class ZuheNumber{
//组合数公式
public static BigInteger jiecheng(int n)
{
if(n<0)
{
System.out.println("输入有误");
}
if(n==1||n==0)
{
return BigInteger.valueOf(1);
}
else
{
return BigInteger.valueOf(n).multiply(jiecheng((n-1)));
}
}
public static long calculateN(int n) {
if(n==1 || n==0){
return 1;
}
return n*calculateN(n-1);
}
public static void main(String args[])
{
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的下标
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的上标
int k=scanner2.nextInt();
BigInteger x,y,z,d,result;
x=jiecheng(n);
y=jiecheng(k);
z=jiecheng(n-k);
d=y.multiply(z);//计算k!*(n-k)!的结果
result=x.divide(d);//计算n!\(k!*(n-k)!)的结果
System.out.println("组合数的结果是:"+result);//输出运算结果
}
}
第二种方法:
//信1605-1 寇肖萌 20163446
import java.util.Scanner;
import java.lang.Math.*;
public class ZuheNumber1 {
public static int n;
public static int k;
public static int c[][]=new int[100][100];
ZuheNumber a=new ZuheNumber();
public static void main(String args[])
{
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的下标
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的上标
int k=scanner2.nextInt();
c[0][0]=1;//初始化
c[1][0]=1;//初始化
c[1][1]=1;//初始化
for(int i=2;i<=n;i++)
{
c[i][0]=1;
c[i][i]=1;//初始化每行 杨辉三角的两边的值
for(int j=1;j<=i;j++)
{
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
}
System.out.println("组合数的结果是:"+c[n][k]);
}
}
第三种方法:
//信1605-1 寇肖萌 20163446
import java.util.Scanner;
public class ZuheNumber2 {
public static int n;
public static int k;
public static int c[][]=new int[100][100];
public static void main(String args[])
{
System.out.print("请输入组合数的n和k:");
Scanner scanner1=new Scanner(System.in);//组合数的下标
int n=scanner1.nextInt();
Scanner scanner2=new Scanner(System.in);//组合数的上标
int k=scanner2.nextInt();
c[0][0]=1;//初始化
c[1][0]=1;//初始化
c[1][1]=1;//初始化
System.out.println("组合数的结果是:"+digui(n,k));
}
public static int digui(int n0,int k0)
{
if((k0==n0)||(k0==0))
{
return 1;
}
c[n0][k0]=digui(n0-1,k0)+digui(n0-1,k0-1);
return c[n0][k0];
}
}
4.程序结果截图