ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java-每日编程练习题③

2019-05-07 18:54:38  阅读:297  来源: 互联网

标签:练习题 分子 遍历 Java 编程 number 列表 计算 报数


一、计算圆周率

  中国古代数学家研究出了计算圆周率最简单的办法:
    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 }

 

标签:练习题,分子,遍历,Java,编程,number,列表,计算,报数
来源: https://www.cnblogs.com/czxoy/p/10827289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有