二:經典算法問題?
2.1雞兔同籠問題(窮舉法)
已知:雞兔共35只,共94只腳,那麼雞和兔各幾隻?
示例代碼:
1 public class SameCage { 2 public static void main(String[] args) { 3 //循環變量j,控制小雞的個數: 0到35遞增 4 //循環變量t,控制兔子的個數: 35到0遞減 5 for(int j=0,t=35; j<=35; j++,t--) {//如果有多個小條件,用逗號隔開 6 //保證腳的數量是94 7 if(j*2 + t*4 == 94) { 8 System.out.println("雞:"+j+", 兔:"+t); 9 } 10 } 11 } 12 }
輸出結果:
雞:23, 兔:12
2.2斐波那契問題
已知:斐波那契數列的前幾個數分別爲0,1,1,2,3,5…從第三項開始,每一項都等於前兩項的和.請接收用戶輸入的整數n,求出此數列的前n項.
斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……
其規律很明顯,從第3個數開始,每個數都等於它前兩個數的和。
下面我們可以通過用戶輸入的數字n來輸出斐波那契數列的前n項
示例代碼:
1 public class Faibonacci { 2 public static void main(String[] args) { 3 System.out.println("請輸入您要測試的數:"); 4 int n = new Scanner(System.in).nextInt(); 5 //判斷n是否是不正常的範圍 6 if(n<1){ 7 System.out.println("輸入數據有誤!!!"); 8 } 9 //n==1 10 if(n==1){ 11 System.out.println(0); 12 } 13 //n==2 14 if(n==2){ 15 System.out.println(0+"\t"+1); 16 } 17 //n==3 18 if(n==3){ 19 System.out.println(0+"\t"+1+"\t"+1); 20 } 21 //拼接前n項 22 if(n>3){ 23 System.out.print(0+"\t"+1+"\t"+1+"\t"); 24 } 25 //循環輸出後面的數據 26 int f1=1; 27 int f2=1; 28 int next=0; 29 for(int i=4;i<=n;i++){ 30 next=f1+f2; 31 f1=f2; 32 f2=next; 33 System.out.print(next+"\t"); 34 } 35 } 36 }
如: 輸入 10
結果爲: 0 1 1 2 3 5 8 13 21 34
2.3打印100以內除了尾數爲3,5,7的所有數
示例代碼:
1 public class ForContinue { 2 public static void main(String[] args) { 3 System.out.println("結果爲:"); 4 for(int i=1;i<=100;i++) { 5 int y = i%10;//100以內的數,通過取餘求出尾數 6 if(y==3 || y==5 || y==7) { 7 continue;//如果尾數爲3 5 7 ,則跳過後面的打印,進行下一輪循環 8 } 9 System.out.print(" "+i); 10 } 11 } 12 }
輸出結果: 1 2 4 6 8 9 10 11 12 14 16 18 19 20 21 22 24 26 28 29 30 31 32 34 36 38 39 40 41 42 44 46 48 49 50 51 52 54 56 58 59 60 61
62 64 66 68 69 70 71 72 74 76 78 79 80 81 82 84 86 88 89 90 91 92 94 96 98 99 100
2.4求猴子大王
15個猴子圍成一圈選大王,依次1-7循環報數,報到7的猴子被淘汰,直到最後一隻猴子稱爲大王,問:哪隻猴子會成爲大王?
示例代碼:
1 public class MonkeyKing { 2 public static void main(String[] args) { 3 //1.定義長度爲15的數組保存猴子,boolean類型是爲了判斷猴子是否存活 4 boolean[] b=new boolean[15]; 5 6 //2.依次遍歷每一隻猴子 7 //true---未淘汰 false---已淘汰 8 for(int i=0;i<b.length;i++){ 9 b[i]=true;//先把所有猴子設置成存活 10 } 11 //3.定義變量保存猴子報的數 12 int num=0; 13 //4.定義變量保存剩餘的猴子數 14 int monkeyLeft=15; 15 //5.定義數組下標 16 int index=0; 17 //6.循環,直到只剩最後一隻猴子(猴子王) 18 while(monkeyLeft>1){//判斷條件 19 //7.檢測猴子是否已淘汰 20 if(b[index]){ 21 //8.報數 22 num++; 23 //9.判斷報數是否爲7 24 if(num==7){ 25 b[index]=false;//爲7淘汰 26 monkeyLeft--;//猴子數減一 27 num=0;//報數歸零 28 } 29 30 } 31 32 //10.下標移動 33 index++; 34 //11.圍成一圈---最後一個置爲0 35 if(index==15){ 36 index=0; 37 } 38 } 39 40 //遍歷數組,找到最後活着的那個猴子王 41 for(int i=0;i<b.length;i++){ 42 if(b[i]){ 43 System.out.println(i+1); 44 } 45 } 46 } 47 }
輸出結果: 5
2.5古典問題:生兔子問題
有一對兔子,從出生後第3個月起都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月兔子的對數爲多少?
程序分析:前兩個月兔子的對數爲1
從第三個月開始,兔子的對數變成了 2 3 5 8 13 21 …
示例代碼:
1 public class GetRabbitNum { 2 public static void main(String[] args) { 3 System.out.println("請輸入要判斷的月數:"); 4 int month = new Scanner(System.in).nextInt(); 5 System.out.println("第"+month+"月兔子的對數爲:"+getSum(month)); 6 } 7 8 public static int getSum(int month) { 9 //如果是前兩個月,還是1對兔子 10 if(month == 1 || month == 2) { 11 return 1; 12 }else { 13 //從第三個開始,兔子按照2 3 5 8 13 21變化 14 return getSum(month-1)+getSum(month-2); 15 } 16 }
請輸入要判斷的月數: 12
第12月兔子的對數爲:144
2.6打印水仙花數
2.7迴文問題
2.8二分法查找
2.9完數問題
2.10楊輝三角