【課程作業01】
課後作業1_1:
設計思想:輸入C(n,k)中的n,k值,利用n!,採用組合數公式直接進行計算方式求得組合數。
程式流程圖:
源程式程式碼:
1 package zuheshu; 2 import java.math.BigInteger; 3 import java.util.Scanner; 4 public class Zuheshu 5 { 6 public static void main(String[] args) 7 { 8 Scanner con=new Scanner(System.in); 9 System.out.println("請輸入組合數中的n值和k值:"); 10 int a=con.nextInt(); 11 int b=con.nextInt(); 12 if(a<b) 13 { 14 System.out.println("不符合要求,請重新輸入:"); 15 a=con.nextInt(); 16 b=con.nextInt(); 17 } 18 System.out.println("n和k構成的組合數值C(n,k)為:"+ca(a).divide(ca(b)).divide(ca(a-b))); 19 } 20 public static BigInteger ca(int n) 21 { 22 if(n==1 || n==0) 23 { 24 return BigInteger.valueOf(1); 25 } 26 return BigInteger.valueOf(n).multiply(ca((n-1))); 27 } 28 }
結果截圖:
課後作業1_2:
設計思想:使用遞推的方法,先兩兩疊加求得n+1層的楊輝三角存入二維陣列中,再取n+1層的k+1項數值即為要求的C(n,k)值。
程式流程圖:
源程式程式碼:
1 package zuheshu; 2 import java.util.Scanner; 3 public class Zuheshu2 4 { 5 public static void main(String[] args) 6 { 7 int[][] n=new int[20][20]; 8 Scanner con=new Scanner(System.in); 9 System.out.println("請輸入組合數中的n值和k值:"); 10 int a=con.nextInt(); 11 int b=con.nextInt(); 12 if(a<b) 13 { 14 System.out.println("不符合要求,請重新輸入:"); 15 a=con.nextInt(); 16 b=con.nextInt(); 17 } 18 for(int h=0;h<a+1;++h) 19 for(int w=0;w<=h;++w) 20 { 21 if(h==w||w==0) 22 n[h][w]=1; 23 else 24 n[h][w]=n[h-1][w]+n[h-1][w-1]; 25 } 26 System.out.println("n和k構成的組合數值C(n,k)為:"+n[a][b]); 27 } 28 }
結果截圖:
課後作業1_3:
設計思路:輸入C(n,k)中的n和k,使用遞迴的方法用組合數遞推公式計算求值。
程式流程圖:
源程式程式碼:
1 package zuheshu; 2 import java.util.Scanner; 3 public class Zuheshu3 4 { 5 public static void main(String[] args) 6 { 7 Scanner con=new Scanner(System.in); 8 System.out.println("請輸入組合數中的n值和k值:"); 9 int a=con.nextInt(); 10 int b=con.nextInt(); 11 if(digui(a,b)==0) 12 { 13 System.out.println("不符合要求,請重新輸入:"); 14 a=con.nextInt(); 15 b=con.nextInt(); 16 } 17 System.out.println("n和k構成的組合數值C(n,k)為:"+digui(a,b)); 18 } 19 public static int digui(int x,int y) 20 { 21 if(x<y) 22 return 0; 23 if(x==y) 24 return 1; 25 if(y==1) 26 return x; 27 return digui(x-1,y-1)+digui(x-1,y); 28 } 29 }
結果截圖:
課後作業2:
設計思路:採用遞迴演算法進行漢諾塔每層的移動,輪流使用目標塔和初始塔作為輔助塔,完成所有塔層的位移。
程式流程圖:
源程式程式碼:
1 package hannuota; 2 import java.util.Scanner; 3 public class Hannuota 4 { 5 static int t=1; 6 public static void main(String[] args) 7 { 8 Scanner con=new Scanner(System.in); 9 System.out.println("請輸入漢諾塔層數:"); 10 int g=con.nextInt(); 11 System.out.println("漢諾塔移動步驟為:"); 12 hannuota(g,"A","B","C"); 13 } 14 public static void hannuota(int n,String ta1,String ta2,String ta3) 15 { 16 if(n==1) 17 move(ta1,ta3); 18 else 19 { 20 hannuota(n-1,ta1,ta3,ta2); 21 move(ta1,ta3); 22 hannuota(n-1,ta2,ta1,ta3); 23 } 24 } 25 public static void move(String x,String y) 26 { 27 System.out.println("第"+t+"步為:"+x+" -->> "+y); 28 t+=1; 29 } 30 }
結果截圖:
課後作業3:
設計思路:輸入字串後,呼叫toCharArray函式將字串轉化成字元陣列,然後遞迴對比首尾字元並向內兩兩縮排,比較次數超過字元陣列長度一半就跳出,說明比較完畢,則輸出是迴文字串,中途若有判斷為不是的,則返回false。
程式流程圖:
源程式程式碼:
1 package huiwen; 2 import java.util.Scanner; 3 public class Huiwen 4 { 5 static char[] c; 6 public static void main(String[] args) 7 { 8 Scanner con=new Scanner(System.in); 9 String s=con.next(); 10 c=s.toCharArray(); 11 if(panduan(0)==true) 12 System.out.println("該字串是迴文字串"); 13 else 14 System.out.println("該字串不是迴文字串"); 15 } 16 public static boolean panduan(int n) 17 { 18 if(n>=c.length/2) 19 return true; 20 else if(c[n]==c[c.length-1-n]) 21 return panduan(n+1); 22 else return false; 23 } 24 }
結果截圖: