Java方法课程作业1,2,3

课程作业01

(1)使用组合数公式利用n!来计算

程序设计思想:

(大数据整数)

先定义一个取值上标和下标的函数得到nk,和阶乘的函数;

通过阶乘函数返回得到n!k!(n-k)!(其中均为大数据整数的计算方法);

计算n!/[k!*(n-k)!]

程序流程图:

 

源程序代码:

import java.util.Scanner;

import java.math.BigInteger;

public class Combinatorics {

int n;//组合数的下标

    int k;//组合数的上标

public static void main(String[] args) {

// TODO Auto-generated method stub

       Combinatorics c=new Combinatorics();

       c.getBiao();

       BigInteger x,y,z,C,d;//定义大数据整数

       x=c.jiecheng(c.n);//得到n!

       y=c.jiecheng(c.k);//得到k!

       z=c.jiecheng(c.n-c.k);//得到(n-k)!

       d=y.multiply(z);//计算k!*(n-k)!

       C=x.divide(d);//计算n!/[k!*(n-k)!]

       System.out.println("组合数Cnk="+C);

}

    public void getBiao()//得到组合数的上标和下标

    {

     System.out.println("请输入组合数的下标和上标:");

Scanner scanner=new Scanner(System.in);

n=scanner.nextInt();//输入下标

k=scanner.nextInt();//输入下标

    }

    public BigInteger jiecheng(int n0)//计算输入的整数的阶乘

    {

     BigInteger ji=BigInteger.ONE;//定义大数据整数ji

     for(int i=1;i<=n0;i++)//循环可得到n0!

     {

       ji=ji.multiply(BigInteger.valueOf(i));

     }

     return ji;//返回积

    }

}

程序截图:

 

(2)使用递推的方法用杨辉三角形计算

程序设计思想:

先输入组合数的上标和下标,定义二维数组方便存放数据;

初始化二维数组最开始的几个值,方便递推运算;

利用递推关系得到赋予二维数组值;

组合数Cnk就等于c[n][k].

程序流程图:

 

源程序代码:

import java.math.BigInteger;

import java.util.Scanner;

public class Combinatorics {

public static int n;//组合数的下标

    public static int k;//组合数的上标

    public static int c[][]=new int[100][100];//定义二维数组

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println("请输入组合数的下标和上标:");

Scanner scanner=new Scanner(System.in);

n=scanner.nextInt();//输入下标

k=scanner.nextInt();//输入上标

c[0][0]=1;//初始化

c[1][0]=1;//初始化

c[1][1]=1;//初始化

for(int i=2;i<=n;i++)

{

c[i][0]=1;//k=0

c[i][i]=1;//k=n

  for(int j=1;j<=i;j++)

  {

   c[i][j]=c[i-1][j-1]+(c[i-1][j]);//递推

  }

}

System.out.println("组合数Cnk="+c[n][k]);//输出Cnk的值

  }

}

程序截图:

 

(3)使用递归的方法用组合数递推公式计算

程序设计思想

先输入组合数的上标和下标,定义二维数组方便存放数据;

定义递归函数;

初始化二维数组最开始的几个值,用递归函数完成递推运算,赋予二维数组值;

组合数Cnk就等于c[n][k].

程序流程图:

 

源程序代码:

import java.util.Scanner;

public class Combinatorics {

int n;//组合数的下标

    int k;//组合数的上标

    int c[][]=new int[100][100];

public static void main(String[] args) {

// TODO Auto-generated method stub

Combinatorics m=new Combinatorics();//构造函数

System.out.println("请输入组合数的下标和上标:");

Scanner scanner=new Scanner(System.in);

m.n=scanner.nextInt();//输入下标

m.k=scanner.nextInt();//输入上标

m.c[0][0]=1;//初始化

m.c[1][0]=1;//初始化

m.c[1][1]=1;//初始化

m.c[m.n][m.k]=m.digui(m.n,m.k);//调用递归函数

System.out.println("组合数C"+"("+m.n+")"+"("+m.k+")"+"="+m.c[m.n][m.k]);//输出组合数Cnk

  }

public 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];//返回值

}

}

程序截图:

 

课后作业2(汉诺塔)

程序设计思想:

调用递归函数hanoi,其终止条件为hanoi函数的参数n的值为1

此程序只是输出移动的方案。

程序流程图:

 

源程序代码:

import java.util.Scanner;

public class Hannuota {

public static void main(String[] args) {

// TODO Auto-generated method stub

Hannuota h=new Hannuota();//定义一个引用函数

int m;//要挪动的个数

System.out.print("请输入要挪动的个数:");

Scanner scanner=new Scanner(System.in);

m=scanner.nextInt();//输入m

System.out.println("移动的步骤为:");

h.hanoi(m,"peg1","peg2","peg3");//调用hanoi函数

}

public void hanoi(int n,String one,String two,String three)

{//将n个盘从one座借助two座,移到three座

if(n==1)

{

System.out.println(one+"->"+three);//输出该步骤

}

else

{

hanoi(n-1,one,three,two);//调用自己

System.out.println(one+"->"+three);

hanoi(n-1,two,one,three);

}

}

}

程序截图:

 

课后作业3

程序设计思想:

先输入要判断的字符串;

定义递归函数(其中是判断action是否等于over,若是则返回true(回文字符串),否则继续调用自己返回值);

最后判断返回值,看是否是字符串。

程序流程图:

 

源程序代码:

import java.util.Scanner;

public class Huiwen {

public static void main(String[] args) {

// TODO Auto-generated method stub

Huiwen h=new Huiwen();//定义一个引用

String zifuchuan="";

System.out.print("输入你要进行判断的字符串:");

Scanner sr=new Scanner(System.in);

zifuchuan=sr.next();//输入要判断的字符串

int i=zifuchuan.length();//字符串的长度

boolean b=h.diguiPanduan(zifuchuan,0,i-1);//对递归函数的调用,将返回值赋予b

if(b==true)//判断布尔类型b

{

System.out.println("该字符串是回文字符串");

}

else

{

System.out.println("该字符串不是回文字符串");

}

}

public boolean diguiPanduan(String s,int action,int over)//递归函数

{

if(action==over)

{

return true;//返回值

}

else if(s.charAt(action)==s.charAt(over))//判断字符是否相等

{

return diguiPanduan(s,action+1,over-1);//对自身的调用

}

else

{

return false;//返回值

}

}

}

程序截图:

 

原文地址:https://www.cnblogs.com/lovema1210/p/7658194.html