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)。通
过这个规律,也可以轻松实现计算。这里我采用的是上一个方式。
代码实现如下:
public class Test01 {
public static void main(String[] args) {
double p = 0; //计算的PI值
int j=1; //分子
for(int i=1;true;i++) { //自造死循环进行运算
p += 4.0/j;
if(j>0) { //若j为正数,下一个j为此时j取反-2
j=-j-2;
}else { //若j为负数,下一个j为此时j取反+2
j=-j+2;
}
if(p>=3.1415926 && p<=3.1415927) { //运算出的PI符合精度要求,则输出计算次数i,并跳出循环
System.out.println(i);
break;
}
}
}
}
二、围圈报数问题
有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
的元素。这样才不会影响这一次的遍历。若在遍历中直接移除该元素,那么此次遍历的下一循环遍历的就已经不是之前的列表了。
代码实现如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Test02 { public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入n的值:");
int n = s.nextInt();
s.close(); List<Integer> list = new ArrayList<>(); //人物列表list
List<Integer> list0 = new ArrayList<>(); //声明一个集合list0,只存入一个元素0
list0.add(0);
for(int i=1;i<=n;i++) { //在列表中依次存入每个人的位置
list.add(i);
}
System.out.println(list); int number=1; //报数的数
while(true) { for (int i = 0; i < list.size(); i++) {
if(number%3==0) { //若报数报到3,则此人出圈
System.out.print(list.get(i)+"号出圈 ");
list.set(i, 0); //将出圈之人位置处元素置为0
}
number++; //报数
}
System.out.println();
list.removeAll(list0); //报完一圈数后移除列表中所有值为0的元素(即将出圈之人在列表中移除)
System.out.println(list); if(list.size()==1) { //当列表长度为1时,打印出该元素的值,即为原来排的位数,并跳出循环
System.out.println("留到最后的为:"+list.get(0));
break;
}
}
}
}
Java-每日编程练习题③的更多相关文章
- 6、50道JAVA基础编程练习题跟答案
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...
- 50道JAVA基础编程练习题
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...
- Java每日编程day2
Java每日编程day2 第一题 package com.pcx.day2; /* * 九九乘法表并逆序 */ public class JiuJiu { public static void mai ...
- 50道JAVA基础编程练习题 - 题目
50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...
- JAVA 基础编程练习题
1 [程序 1 不死神兔] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?程序分析: 兔子的规 ...
- 2017年9月11日 梁勇 java教材 编程练习题 第二章 2.15 键盘 读取两个点的坐标值(小数),控制台输出两点间距离。
package com.swift; import java.util.Scanner; public class PToP { public static void main(String[] ar ...
- 梁勇 java教材 编程练习题 第二章 2.6 键盘 读取一个在0 到 9999 之间的整数,并将该整数的各位数字相加。
import java.util.Scanner; /** * 需求:从键盘输入任意0~9999之间的整数,输出这个整数各位数字之和. * 思路:方法一,使用扫描器Scanner类,扫描控制台输入流 ...
- JAVA 基础编程练习题50 【程序 50 文件 IO】
50 [程序 50 文件 IO] 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩), 计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件&qu ...
- JAVA 基础编程练习题49 【程序 49 子串出现的个数】
49 [程序 49 子串出现的个数] 题目:计算字符串中子串出现的次数 package cskaoyan; public class cskaoyan49 { public static void m ...
- JAVA 基础编程练习题48 【程序 48 加密】
48 [程序 48 加密] 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密 规则如下:每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交 ...
随机推荐
- SVN回滚机制
引子 工作中遇到一个新同事提交代码时不知怎么的出现了大面积的代码覆盖,由于对SVN也不是特别了解,就看着别人处理问题,自己也验证性的实践了一下,总结一下. 总结 svn每一次提交成功,都会有一个`编号 ...
- bzoj3090: Coci2009 [podjela]
这个范围明显树包的 然而值并不滋磁 想了一会发现可以带一维当前子树用了多少边,搞定当前向上还能送多少 然后发现会有搞不定的情况,要向上传负数 每次都要重新初始化,负数强制要要 #include< ...
- 织梦dedecms内页分类频道友情链接实现方法
本文介绍了织梦dedecms中内页分类频道加友情链接的三种方法,有需要的朋友参考下. 织梦dedecms中内页分类频道加友情链接,方法有三种: 先讲方法,后讲原理: 方法:先找到首页模版index.h ...
- Hadoop的jobhistoryserver配置
配置mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</na ...
- Eclipse中文乱码问题
最近用TortoiseSVN从androiddex上下载了一个android工程,导入之后发现里面的中文都是乱码,于是在Eclipse里通过Windows-Preferences-Workspace修 ...
- I.MX6 lcd lvds 注册流程
/************************************************************************ * I.MX6 lcd lvds 注册流程 * 说明 ...
- 搜索好题UVA1601
题目 分析:如果以当前3个小写字母的位置为状态,则问题转化为图上的最短路问题.但是如果每次都判断小写字母的下一步是否合法,那就是说每次移动都需要判断5^3,肯定会超时.可以把所有可以移动的格子找出来建 ...
- MultiAutoCompleteTextView
Activity_mian.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法Windows版(手贱强制重启电脑的后果)
转自:https://blog.csdn.net/rrrrroy_ha/article/details/80601497
- C++ 多项目dll调用-隐式
将DAA人脸检测做成动态库以便其他程序调用,采用隐式调用完成. 给出部分关于dll制作的关键代码: 1.DLL 多项目DLL编写注意将其他相关项目设置成静态库,以及各库涉及的版本一致性. DLL.h ...