Java/java程序设计第三章课后习题详解;
- 1.产生10个随机数相加,且随机数为1到15之间,返回正确的式子个数与程序运行时间
- 1.2Random其他类型使用方法代码片段:
- 2.根据算式,求解自然常数e,精度达到10^-6^ . e ≈ 1 + 1/1! + 1/2! + 1/3! + ... + 1/n!
- 3.给定范围求素数
- 4.打印所有水仙花数 (100 - 1000)内
- 5.给定某年某月某日判断是一年的第几天
- 今日份Java整理结束,啦啦啦^ - ^感谢各位看官!
1.产生10个随机数相加,且随机数为1到15之间,返回正确的式子个数与程序运行时间
分析问题得出需求:
一:随机数怎么获得,查阅Java文档知道
(1) 引入java.util.Random; 包即可
(2) 再创建对象: Random r = new Random();
(3) 然后获取随机数 int x = r.nextInt(15)+1;
值得注意的是这样获取的是[1,15];
1.2Random其他类型使用方法代码片段:
Random r = new Random();
r.nextInt(); //创建一个正整数
//1.想要生成一个[0,n)的整数 例如:生成[0,10)
r.nextInt(10);
//2. 想生成范围在[0,n]的整数 例如:生成[0,10]
r.nextInt(11);
//3.想生成范围在[m,n]的整数, n > m 例如:生成[5,10] 即[0,5] + 5
int a = r.nextInt(6) + 5;
a = r.nextInt() % (6) + 5;
//4.想生成范围在(m,n)的整数 例如:生成(5,10)即[0,4) + 6
a = r.nextInt(4) + 6;
a = r.nextInt() % (4) + 6;
//其他类型数据类似
r.nextLong(); //随机生成long类型范围的整数
r.nextFloat(); //随机生成[0, 1.0)区间的小数
r.nextDouble(); //随机生成[0, 1.0)区间的小数
本题的代码为:
import java.util.Random; //导入Random包;
public class TextRandom {
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); //创建自带的包 记录程序运行的起始时间startTime;
int n = 0;
Random r = new Random(); //创建对象;
for(int i = 1;i <= 10;i++){
int x = r.nextInt(15)+1; //r.nextInt(15)+1,生成[1,15)的随机数
int y = r.nextInt(15)+1;
int z = r.nextInt(15)+1; //输出三个随机数以加法的形式;
System.out.println(i + ": " + x + " + " + y + " = " + z);
if(x + y == z){ //判断随机数是否满足正确的加法;
n++; //满足则计数器加一记录;
}
}
long endTime = System.currentTimeMillis(); //创建自带的包 记录程序运行的结束时间endTime;
long runTime = endTime - startTime; //求运行时间差得出测试程序的时长;
System.out.println("==============================");
System.out.println("The correct number of formulas is :" + n +
"\nRuntime is :" + runTime + "ms");
} //输出计数器n 与 测试时间 ;
}
运行结果如图:
2.根据算式,求解自然常数e,精度达到10-6 . e ≈ 1 + 1/1! + 1/2! + 1/3! + … + 1/n!
分析问题得出需求:第一个1可以写成 1/1
首先算式 可以拆分为 分子恒为1 / (分母+=1) 然后又将分数累加起来
个人感觉用while循环再讨一个阶乘来做明显更简洁一点,更容易一点。
话不多说上代码:
public class NaturalConstant {
public static void main(String[] args) {
double e = 1;
double t = 1;
double fm = 1;
double n = 1; // 定义算式各个变量
do{
e = e + 1 / fm;
n++;
for(double i = 1;i <= n;i++){ //求阶乘用n作为计数器,t来保留值,传递给fm
t *= i;
}
fm = t;
t = 1;
}while((1.0/fm) >= 1E-6); //判断是否满足精度要求 单项值 是否大于等于 1E-6
System.out.println("e = " + e); //输出 e
}
}
运行结果:
3.给定范围求素数
判断是否为素数核心代码片段如下:作为类中的方法来调用
class prime {
bool judge(int n){
int i = 0;
if (n < 2) return 0;
for (i = 2; i <= sqrt(n); i++) {
if (n%i == 0)
return 0;
}
return 1;
}
}
完整代码:
public class Primejudge {
public static void main(String[] args) {
Prime p = new Prime(); //创建对象p来获取类中方法;
int sum = 0;
for(int i = 101;i < 200;i++){
if(p.judge(i)){ //调用方法judge(判断)是否为素数
sum++; //是则计数器sum加一,并输出该素数;
System.out.print(i + " ");
}
}
System.out.println("\n" + "prime:" + sum);
}
}
class Prime {
boolean judge(int n){ //核心代码最基础的判断是否为素数;
int i = 0;
if (n < 2) return false;
for (i = 2; i <= Math.sqrt(n); i++) {
if (n%i == 0)
return false;
}
return true;
}
}
运行结果:
4.打印所有水仙花数 (100 - 1000)内
首先明确什么是水仙花数:
各个位上的数的立方和等于本身 就叫做水仙花数
public class NarcissisticNumber {
public static void main(String[] args) {
Nar na = new Nar();
int sum = 0;
for(int i = 100;i < 1000;i++){
if(na.jugde(i)){
sum++;
System.out.print(i + " ");
}
}
System.out.println("\nNarcissisticNumber have : " + sum );
}
}
class Nar { //定义一个类,在其中写入jugde方法判断 i 是否为水仙花数
boolean jugde (int n){
int a, b, c;//由于是boolean类型的方法 所以 return 会返回 true or false 以供判断
a = n / 100;
b = n / 10 % 10;
c = n % 10;
return ((a * a * a + b * b * b + c * c * c) == n);
} //true or false;
}
运行结果:
5.给定某年某月某日判断是一年的第几天
明确需求分析问题:
天数=日+月转化的天数
其中只要区分闰年 还是 平年即可,转换月份时注意二月一个为**29** 一个为**28** ;
import java.util.Scanner;
public class judgeyear {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] run = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年的月份有数组存储起来
int[] ping = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年的月份有数组存储起来
System.out.print("enter year:"); //键盘输入 年 月 日;
int year = sc.nextInt();
System.out.print("enter mouth:");
int mouth = sc.nextInt();
System.out.print("enter day:");
int day = sc.nextInt();
int number = day;
if((year % 4 == 0 && year % 100 != 0)||year % 400 == 0){//判断为平,闰年再求和将月份转化为天数
for(int i = 0;i < mouth - 1;i++){
number += run[i]; //for循环run数组求和
}
}
else{
for(int i = 0;i < mouth - 1;i++){ //for循环ping数组求和
number += ping[i];
}
}
System.out.println(year + "-" + mouth + "-" + day + " is the first " + number + " days");
} //输出结果
}
运行结果如图:
今日份Java整理结束,啦啦啦^ - ^感谢各位看官!