使用计算机计算组合数
一、实验设计思想:
定义类A来存放递推求阶乘的方法,类B存放利用杨辉三角求cnk的方法,类C存放递归求阶乘的方法,A中即1*2*3.。。。较为简单,B中先定义数组来显示杨辉三角,cnk即a[n+1][k+1]的值。C类中方法即要想求n!则需要n-1!*n以此类推用递归计算。
二、程序流程图
三、程序源代码:
class A
{
public int 求阶乘(int n)
{int n1=1;
for(int i=1;i<=n;i++)
{
n1=n1*i;
}
return n1;
}
}
class B
{
public int cnk(int n,int k)
{
int b=1;
int a[][]=new int[n+1][n+1];
for(int i=0;i<n+1;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(int i=1;i<n+1;i++)
{
for(int j=1;j<n;j++)
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(int i=0;i<n+1;i++)
{
for(int j=0;j<=i;j++)
{
System.out.print(a[i][j]);
}
System.out.println("");
b++;
}
return a[n][k];
}
}
class C
{
public int 求阶乘(int n)
{
if(n==1)
return 1;
else
return (求阶乘(n-1)*n);
}
public int 求阶乘大(int n)
{
return 0;
}
}
public class zuoye {
public static void main(String[] args) {
// TODO 自动生成的方法存根
B b=new B();
A a=new A();
C c=new C();
int n,k;
n= Integer.parseInt(JOptionPane.showInputDialog("请输入n"));
k= Integer.parseInt(JOptionPane.showInputDialog("请输入k"));
if(n>=k)
{
JOptionPane.showMessageDialog(null,a.求阶乘(n)/a.求阶乘(n-k)/a.求阶乘(k)+"="+a.求阶乘(n+1)/a.求阶乘(n+1-k)/a.求阶乘(k)+"-"+a.求阶乘(n)/a.求阶乘(n-k+1)/a.求阶乘(k-1));
System.out.println(b.cnk(n, k));
JOptionPane.showMessageDialog(null, "Cnk="+c.求阶乘(n)/c.求阶乘(n-k)/c.求阶乘(k));
}
四、结果截图:
递归解决汉诺塔问题
一、实验设计思想:
若想将n个盘子移到第三个位置,则现需要将前n-1个盘子移到第二个位置然后把第三个盘子移到三个位置,再把第n-1个盘子通过1位置移到3位置上,正好符合递归的用法。
二、流程图
三、源代码
class Yidong
{
public void move(int n,char a,char b)
{
System.out.println("标号"+n+"的盘子:"+a+"->"+b);
}
public void yd(int n,char A ,char B,char C)
{//将A上的n个盘子通过B的辅助移到C上
if(n==1)
move(1,A,C);
else
{
yd(n-1,A,C,B);
move(n,A,C);
yd(n-1,B,A,C);
}
}
}
public class hannuota {
public static void main(String[] args) {
Yidong y=new Yidong();
int n;
char a,b,c;
n=Integer.parseInt(JOptionPane.showInputDialog(null,"输入盘子数"));
y.yd(n,'A','B','C');
}
四、实验结果截图:
判断字符串的回文情况
一、回文即正着和倒着一样,先输入一个字符串,然后把它转化成字符数组,从两边向中间推进,进行判断。
二,流程图
三,源代码
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String s=JOptionPane.showInputDialog(null,"请输入要判断的字符串:");
char[] ch = s.toCharArray();
if(p(ch,ch.length,0)==1)
JOptionPane.showConfirmDialog(null,"是回文字符串",
"判断结果",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
else if(p(ch,ch.length,0)==0)
JOptionPane.showConfirmDialog(null,"是不回文字符串",
"判断结果",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
}
static int p(char a[],int len,int n)
{
if(n>=len-1-n)
return 1;
else if(p(a,len,n+1)==1&&a[n]==a[len-n-1])
return 1;
else return 0;
}
}
四、结果截图: