一、計算圓周率
中國古代數學家研究出了計算圓周率最簡單的辦法:
PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17......
這個算式的結果會無限接近於圓周率的值,我國古代數學家祖沖之計算出,圓周率在3.1415926和3.1415927之間,
請編程計算,要想得到這樣的結果,他要經過多少次加減法運算?
分析:
這題的關鍵是要實現PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17...... 這一個表達式的計算。
通過找規律可以發現,不管計算次數為多少,加的數的分母部分都是4,而分子部分后一個分子為前一個分子取反后+2 或 -2 (此時
分子為負數時,下一個分子為此時分子取反+2 ;此時分子為正數時,下一個分子為此時分子取反-2 。找到計算規律就可以通過for循環
來計算PI了。
當然也可以這樣找規律:當計算次數為偶數時,分母為-4 ;計算次數為奇數時,分母為4。 而分子的值顯然為1+2*(計算次數-1)。通
過這個規律,也可以輕松實現計算。這里我采用的是上一個方式。
代碼實現如下:
1 public class Test01 { 2 3 public static void main(String[] args) { 4 double p = 0; //計算的PI值 5 int j=1; //分子 6 for(int i=1;true;i++) { //自造死循環進行運算 7 p += 4.0/j; 8 if(j>0) { //若j為正數,下一個j為此時j取反-2 9 j=-j-2; 10 }else { //若j為負數,下一個j為此時j取反+2 11 j=-j+2; 12 } 13 if(p>=3.1415926 && p<=3.1415927) { //運算出的PI符合精度要求,則輸出計算次數i,並跳出循環 14 System.out.println(i); 15 break; 16 } 17 } 18 } 19 }
二、圍圈報數問題
有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。
分析:
采用數組列表ArrayList存儲這n個人的數據,索引為0到(n-1),存儲的值為索引+1,即每個人原來位置的標號。
然后采用一個變量number來表示報數的數,遍歷列表,遍歷一個元素number就+1 ,當number為3的倍數時,即報數報到3,則移除此時遍歷到
的這個元素,直到列表中只剩下一個元素,打印這個元素即可。
注:
1、 number一直加下去,遍歷第一輪報數后移除部分元素的新列表時,number從上個列表報的數繼續+1 ,這樣才能實現轉圈報數。
2、 number為3的倍數時,移除列表中的元素,我采用先置該位置元素為0,遍歷完這個列表后才統一通過removeAll()方法移除所有值為0
的元素。這樣才不會影響這一次的遍歷。若在遍歷中直接移除該元素,那么此次遍歷的下一循環遍歷的就已經不是之前的列表了。
代碼實現如下:
1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Scanner; 4 5 public class Test02 { 6 7 public static void main(String[] args) { 8 Scanner s = new Scanner(System.in); 9 System.out.println("請輸入n的值:"); 10 int n = s.nextInt(); 11 s.close(); 12 13 List<Integer> list = new ArrayList<>(); //人物列表list 14 List<Integer> list0 = new ArrayList<>(); //聲明一個集合list0,只存入一個元素0 15 list0.add(0); 16 for(int i=1;i<=n;i++) { //在列表中依次存入每個人的位置 17 list.add(i); 18 } 19 System.out.println(list); 20 21 int number=1; //報數的數 22 while(true) { 23 24 for (int i = 0; i < list.size(); i++) { 25 if(number%3==0) { //若報數報到3,則此人出圈 26 System.out.print(list.get(i)+"號出圈 "); 27 list.set(i, 0); //將出圈之人位置處元素置為0 28 } 29 number++; //報數 30 } 31 System.out.println(); 32 list.removeAll(list0); //報完一圈數后移除列表中所有值為0的元素(即將出圈之人在列表中移除) 33 System.out.println(list); 34 35 if(list.size()==1) { //當列表長度為1時,打印出該元素的值,即為原來排的位數,並跳出循環 36 System.out.println("留到最后的為:"+list.get(0)); 37 break; 38 } 39 } 40 } 41 }
