Java/java程序设计第三章课后习题详解;1.产生10个随机数相加,随机数为1到15返回正确的个数与运行时间 2.求解自然常数e 3.给定范围求素数 4.打印所有水仙花数 5.给定年月日判断第几天

本文详细解析了Java编程中的五个经典问题:如何生成10个1到15的随机数并计算正确组合数及运行时间,计算自然常数e,求解给定范围内的素数,找出100到1000内的水仙花数,以及根据年月日判断一年中的第几天。通过实例代码展示了实现过程和运行结果。
摘要由CSDN通过智能技术生成

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 
	}
}

运行结果:
cmd 图片

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;
	}
}

运行结果:
cmd 图片

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;
}

运行结果:
cmd 图片

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");
	}		//输出结果
}

运行结果如图:
cmd运行结果

今日份Java整理结束,啦啦啦^ - ^感谢各位看官!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值