java课后实验性问题2

课后作业一:计算组合数

程序设计思想:

       从键盘获取组合数,判断是否构成组合数。分别用三种方法计算组合数输出。

程序流程图:

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args){
        System.out.print("请输入数:");
        Scanner sc = new Scanner(System.in);
        //从键盘获取组合数
       int n = sc.nextInt();
      System.out.print("请输入组合个数:");
      int k = sc.nextInt();
        //判断格式 正确计算组合数
      if(n < k){    
            System.out.print("输入错误!");
      }
      else{
           System.out.println("组合数计算:" + zhuhe(n, k));
          System.out.println("杨辉三角计算:" + ditui(n, k));
          System.out.println("组合数递推计算:" + digui(n, k));
      }
    }
    //递归递推计算
    public static long digui(int n, int k){
        return ditui(n, k);
    }
    //杨辉三角递推计算
    public static long ditui(int n, int k){          
        long m1, m2, sum;
       m1 = calculateN(n - 1) / (calculateN(k - 1) * calculateN((n - 1) - (k - 1)));
       m2 = calculateN(n - 1) / (calculateN(k) * calculateN((n - 1) - k));
        sum = m1 + m2;
        return sum;
    } 
    //公式计算
    public static long zhuhe(int n,int k){            
        return calculateN(n) / (calculateN(k) * calculateN(n - k));
  }   
    //递归计算阶乘
    public static long calculateN(int n){
      if(n==1 || n==0){
        return 1;
    }
    return n * calculateN(n - 1);
  }
}

课后作业二:汉诺塔问题

程序设计思想:

把N个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座。

程序流程图:

 

import java.util.Scanner;

public class Test2{
    public static void main(String[] args){
       int n;
    System.out.print("输入盘子层数:");
    Scanner sc = new Scanner(System.in);
        //从键盘获取盘子数
    n = sc.nextInt();
        //递归调用
    hannuo(n, 'A', 'B', 'C');
  }
  public static void hannuo(int n, char a, char b, char c){
        //n=1时,将A上的盘子直接移动到C上
         if(n == 1){
            move(a, c, 1);
      }
      /*
        1,将A上n-1个盘子移动到B上(此步骤的解决办法与移动n阶盘子的方法完全一样只是问题的规模减小1阶)
        2,将A上的一个盘子移动到C
        3,将B上的n-1个盘子移动到C上。
    
        */
      else{
            hannuo(n - 1, a, c, b);
           move(a, c, n);
           hannuo(n - 1, b, a, c);
        }
     }
    //输出操作步骤
  public static void move(char x, char y, int n){
        System.out.println(x + "的第个" + n + "盘子移动到" + y);
  }
}

课后作业三:回文字符串

程序设计思想:

 从键盘获取字符串,定义数组。数组元素依次获取字符。通过递归方法比较数组元素,判断是否是回文字符串。

程序流程图:

import java.io.*;

public class Test3{
    public static void main(String[] args) throws IOException{
        String str;
     int i = 0;
     System.out.print("输入字符串:");
        //从键盘获取字符串
     BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
     str = buf.readLine();
       //定义数组 数组元素依次获取字符
     char [] ch = str.toCharArray();
       //判断是否是回文字符串
    if(huiwen(ch,i) == 1)                        
        System.out.println("是回文字符串");
    else
        System.out.println("不是回文字符串");
  }
    //递归判断回文
  public static int huiwen(char [] ch,int i){
        if(i == ch.length / 2 )
        return 1;
     if(ch[i] != ch[ch.length - i - 1])
        return 0;
     huiwen(ch,i + 1);
     return 1;
  }
}

 

posted @ 2017-10-13 14:58  什么名都不好  阅读(206)  评论(0编辑  收藏  举报