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 }