一、组合数
1.设计思想
首先定义两个变量n和k,采用三种方法计算组合数
第一种,利用组合数公式计算,这种方法主要就是定义一个求阶乘的方法,利用递归可以求得阶乘
第二种,利用递归的方法使用组合数递推公式,递归调用函数,从后往前推导
第三种,利用杨辉三角的原理,设置二维数组,从上到下依次保存杨辉三角所得数,根据输入的nk值,找出对应的值
2.流程图
(1)
(2)
(3)
3.源代码
package test;
import java.util.Scanner;import java.math.BigInteger;public class Classtest1 { public static BigInteger zuheshu(int k,int n) { BigInteger i; i=jiecheng(n).divide((jiecheng(k).multiply(jiecheng(n-k)))); return i; } public static BigInteger jiecheng(int i) { if(i==1 || i==0){ return BigInteger.valueOf(1); } return BigInteger.valueOf(i).multiply(jiecheng((i-1))); } public static BigInteger cal(int k,int n) { if(n==k||k==0) return BigInteger.valueOf(1); else if(k==1) return BigInteger.valueOf(n); else return cal(k,n-1).add(cal(k-1,n-1)); } public static int Ditui(int i,int j) { int a[][]=new int[100][100]; a[0][0]=1; int result=1; for(int p=1;p<100;p++) for(int q=0;q<=p;q++) { if(q==0||p==q) { a[p][q]=1; } else a[p][q]=a[p-1][q-1]+a[p-1][q]; if(p==i&&q==j) { result=a[p][q]; break; }}
return result;
} public static void main(String[] args) { int n,k; Scanner input=new Scanner(System.in); System.out.println("请输入一个正整数作为n值:"); n=input.nextInt(); System.out.println("请输入一个正整数作为k值:"); k=input.nextInt(); System.out.println("使用组合数公式计算出的组合数个数为:"+zuheshu(k,n)); System.out.println("使用递归的方法计算出的组合数个数为:"+cal(k,n)); System.out.println("使用杨辉三角计算出的组合数个数为:"+Ditui(n,k)); }}4.截图
二、汉诺塔
1.设计思想
三个柱子:1.原柱子2.中间柱(辅助)3.目标柱
首先把1柱上"共"n-1个通过3移到2(递归),
如果只剩一个:把1柱上"第"n个直接移动到3柱,把2柱上
"共"n-1个通过1移到3(递归)
2.流程图
3.源代码
package test;
import java.util.Scanner;public class Classtest2 { public void Hnt(int a,char one,char two,char three) { if(a==1) move(one,three); else { Hnt(a-1,one,three,two); move(one,three); Hnt(a-1,two,one,three); } } public void move(char x,char y) { System.out.println("从"+x+"移动到"+y); } public static void main(String[] args) { Classtest2 h=new Classtest2(); Scanner input=new Scanner(System.in); System.out.print("请输入初始盘子数量:"); int num=input.nextInt(); h.Hnt(num,'1','2','3');}
}
4.截图
三、回文
1.设计思想
输入一个字符串,将字符串最大长度赋给一个变量,判断字符串长度,如果为0或1,则输出是回文数,如果不是,则调用递归,从字符串头尾字符开始分别判断是否相等。
2.流程图
3.源代码
package test;
import java.util.Scanner;public class Classtest3 { public int judge(String str,int length,int star,int stop) { if(length==0||length==1) { return 1; } if(str.charAt(star)!=str.charAt(stop)) { return 0; } else { return judge(str,length-2,star+1,stop-1); } }public static void main(String[] args)
{ Scanner input=new Scanner(System.in); System.out.println("输入一个字符串:"); String str; str=input.nextLine(); int l=str.length(); Classtest3 hw=new Classtest3 (); if(hw.judge(str, l, 0, l-1)==1) { System.out.println("是回文字符串"); } else System.out.println("不是回文字符串");}
}
4.截图