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 的余数代替该数字,再将第一位和第四位交 ...
随机推荐
- 计算机学院大学生程序设计竞赛(2015’12)The Magic Tower
The Magic Tower Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- module+standard library.py
#导入模块 import sys sys.path sys.path.append('D:\program files\Python34\PyWorks') #hello.py文件路径 #不用appe ...
- vs 2015 community Blend和devenv启动的区别
使用Blend启动会有部分功能无法显示 如:SVN管理插件,工具栏 使用devenv启动会全部显示
- 【210】通过OleDb读写Excel数据到DataTable
参考:C#通过OLEDB读写Excel2013显示到datagrid控件,修改数据集并更新excel2013 解决:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序.( ...
- CoreBluetooth Central模式 Swift版
也是醉了,CB这个API到现在也没有Swift的文档.最新的文档还是3年前还是4年前的OC版的,被雷的外焦里嫩的.自己一点一点写成Swift还各种报错,最坑的是这些错误压根找不到解决方案.索性自己做个 ...
- Codeforces686C【dfs】
题意: n,m<=1e9 设定一天n小时,一小时m分钟, 显示时间的是一个7进制的表, 问你在一天里出现多少个时刻,表中的数字要都不相同. 思路: 因为7进制,显示的数字肯定是0-7之间的. 然 ...
- c# dynamic 无法创建 泛型变量的问题
IMyClass<T> FunctionA<T>( object arg_obj) { dynamic dyObj = arg_obj; return new MyClass& ...
- VS2019+ASP.NETCore+图表
原帖学习踩坑:https://www.cnblogs.com/fzqm-lwz/p/9704973.html,主要根据大佬原帖内容,实现尝试,进行一些修改: 实现方式一:通过标记帮助程序将JS代码传到 ...
- 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的
微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的 最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想 ...
- 怎么让普通用户达到root用户也可以拥有权限修改文件(CentOS系统)
为什么会提出这个问题呢? 答:因为啊,比如我们在大数据集群搭建的时候,经常会需要配置环境变量,如/etc/profile.那么,问题来了,每次必须得都切换到root用户才能,但是呢,如何可以在普通用户 ...