1、其实将下面代码中的质数输出语句删除,还能再减少代码运行时间,打印输出也会降低代码运行效率。
import java.util.Scanner;
/**
* @Description 测试 FindPrimeNumber1 中的结果
* @author Cheven
* @version v2.0
* @date 2020年11月4日下午9:24:56
*/
public class FindPrimeNumberTest1 {
public static void main(String[] args) {
// 输入想要查找质数的范围
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
FindPrimeNumber1.getPrimeNumber(number);
scanner.close();
/*
* 测试的范围为 100000
* 未优化时所花费时间:12278 毫秒
* 只经过优化一后所花费时间:1198 毫秒
* 只经过优化二后所花费时间:132 毫秒
* 经过优化一和优化二后所花费时间:48 毫秒
*/
}
}
/**
* @Description 查找传入的数范围内的所有质数,质数也称为素数,只能被 1 和它本身整除的自然数,最小的质数是 2
* @author Cheven
* @version v2.0
* @date 2020年11月4日下午9:04:49
*/
public class FindPrimeNumber1 {
private static boolean isFlag = true; // 定义一个布尔型的 标识 变量,用于判断该数是否是质数,true 为质数,false 为非质数
private static int count = 0; // 定义一个整型的 计数 变量,用于计算找出的质数个数
// 获取查找前时间距离 1970 年 1 月 1 日 凌晨 00:00:00 的毫秒数
private static final long startTime = System.currentTimeMillis();
public static void getPrimeNumber(int number) {
for (int i = 2; i <= number; i++) { // 遍历 number 范围内的质数
// for (int j = 2; j < i; j++) {
/****************************************************************
优化二:将 i 开方,对所有数都有效,尤其是本身是质数的数
****************************************************************/
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) { // 如果能够除尽,说明该数不是质数
isFlag = false;
/************************************************************
优化一:加上 break,只对非质数的自然数有效
************************************************************/
break;
}
}
if (isFlag == true) { // 符合此处条件的都是质数
count++;
System.out.print(i + "\t"); // 输出质数
if (count % 5 == 0) { // 每输出 5 个质数就换一行
System.out.println();
}
}
isFlag = true; // 将标识符重置
}
// 获取查找后时间距离 1970 年 1 月 1 日 凌晨 00:00:00 的毫秒数
final long endTime = System.currentTimeMillis();
System.out.println("\n一共查找到 " + count + " 个素数,花费时间为:"
+ (endTime - startTime) + " 毫秒"); // 输出质数个数以及所用时间
}
}