Java-每日編程練習題③


一、計算圓周率

  中國古代數學家研究出了計算圓周率最簡單的辦法:
    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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM