02方法 课后作业1

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

 

posted @ 2017-10-13 22:34  DaisyYuan  阅读(129)  评论(0编辑  收藏  举报