一.计算组合数
1.利用n!计算
设计思想:可以把问题简化为求n的阶乘,然后再利用公式求解
程序流程图:
源代码
import java.util.Scanner;
public class zuhe {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入组合数的参数n,k");
Scanner in1=new Scanner(System.in);
int n=in1.nextInt();
Scanner in2=new Scanner(System.in);
int k=in2.nextInt();
in1.close();
in2.close();
int sum=jiecheng(n)/(jiecheng(k)*jiecheng(n-k));
System.out.println("C("+n+","+k+")="+sum);
}
public static int jiecheng(int p)
{
if(p<=1)
{
return 1;
}
else
return p*jiecheng(p-1);
}
}
程序截图:
2.用递推的方法用杨辉三角形计算
设计思想:
杨辉三角可以反映组合数的值,例如杨辉三角中第六排三列为10,即对应组合数c(5,2);通过递归建立杨辉三角,
再通过杨辉三角输出组合数值。
程序流程图
源代码
import java.util.Scanner;
public class zuhe2 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入组合数的参数n,k");
Scanner in1=new Scanner(System.in);
int n=in1.nextInt();
Scanner in2=new Scanner(System.in);
int k=in2.nextInt();
in1.close();
in2.close();
System.out.println("C("+n+","+k+")="+jiecheng(n,k));
}
public static int jiecheng(int a,int b)
{
if(a<0||b<0||a<b)
return 0;
if(a==b)
return 1;
if(b==1)
return a;
return jiecheng(a-1,b)+jiecheng(a-1,b-1);
}
}
程序截图
三、使用递归的方法用组合数递推公式计算
1.设计思想:通过对组合数递推公式的递归实现,输出组合数的值
2.程序流程图:
3.源程序代码:
public class Zuheshu_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
System.out.println("m 应大于n");
System.out.println("格式为c(m,n)");
System.out.println("m:");
int m=in.nextInt();
System.out.println("n:");
int n=in.nextInt();
System.out.println("c"+"("+m+","+n+")"+"="+digui(n,m));
}
public static int digui(int n,int m)
{
if(n>m||n<0||m<0){return 0;}
if(n==1){return m;}
if(n==m){return 1;}
return digui(n-1,m-1)+digui(n,m-1);
}
}
程序截图
二.汉诺塔问题
设计思想:
假定要把n个盘子按题目规定由a杆借助b杆移动到c杆。模拟这一过程的算法称为hanio(n,a,b,c)。则有:第一步:先把上面的n-1个盘子设法借助b杆放到c杆,记做hanio(n,a,c,b); 第二步:把第n个盘子从a杆直接移到b杆第三步:把c杆上的n-1个盘子借助a杆移到b杆,记做hanio(n,c,a,b)。
程序流程图:
源代码:
import java.util.Scanner;
public class hanio {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner in=new Scanner(System.in);
int i = in.nextInt();
char a ='A',b='B',c='C';
hanio(i,a,b,c);
}
public static void hanio(int n,char a,char b,char c){
if(n==1)
System.out.println("移动"+n+"号盘子从"+a+"到"+c);
else{
hanio(n-1,a,c,b);//把上面n-1个盘子从a借助b搬到c
System.out.println("移动"+n+"号盘子从"+a+"到"+c);//紧接着直接把n搬动c
hanio(n-1,b,a,c);//再把b上的n-1个盘子借助a搬到c
}
}
}
程序截图:
三.回文字符串
设计思想:若字符串长度<=1,则一定为回文字符串。利用函数判断首尾字符是否相等,若相同,则截去首尾返回到函数,直到字符串位数<=1
程序流程图:
源代码:
import java.util.Scanner;
public class huiwen {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入一个字符串:");
Scanner in=new Scanner(System.in);
String str=in.nextLine();
if(huiwen(str)==1)
{
System.out.println(str+"是回文字符串");
}
else
System.out.println(str+"不是回文字符串");
in.close();
}
public static int huiwen(String s)
{
int length=s.length();
if(length==0||length==1)
{
return 1;
}
char head=s.charAt(0);
char tail=s.charAt(length-1);
if(head!=tail)
{
return 0;
}
return huiwen(s.substring(1,length-1));
}
}
程序截图