1. 程式人生 > >使用計算機計算組合數+漢諾塔+判斷回文

使用計算機計算組合數+漢諾塔+判斷回文

span http 問題 out pan line length ssa arr

使用計算機計算組合數

一、實驗設計思想:

定義類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;

}

}

四、結果截圖:

技術分享

技術分享

使用計算機計算組合數+漢諾塔+判斷回文