/*
题目:找出100以内的所有的素数(质数)?100000以内的呢?
质数:只能被1和它本身整除的自然数。比如:2、3、5、7、11、13、17、19、23.....
---->换句话说,从2开始到这个自然数-1为止,不存在此自然数的约数。
*/
class PrimeNumberTest {
public static void main(String[] args) {
/*方式1:
for (int i = 2;i <= 100;i++){ //遍历100以内的自然数
int number = 0; //记录i的约数的个数(从2开始,到i-1为止)
//判定i是否是质数
for (int j = 2;j < i;j++){
if (i % j == 0){
number++;
}
}
if (number == 0){
System.out.println(i);
}
}
*/
//方式2:
//boolean isFlag = true;
for (int i = 2;i <= 100;i++){ //遍历100以内的自然数
boolean isFlag = true;
//判定i是否是质数
for (int j = 2;j < i;j++){
if (i % j == 0){
isFlag = false;
}
}
if(isFlag){//if (isFlag == true){
System.out.println(i);
//重置isFlag
//isFlag = true;
}
}
}
}
运行结果如下:
/*
遍历100000以内的所有的质数。体会不同的算法实现,其性能的差别
此PrimeNumberTest1.java是实现方式1
*/
class PrimeNumberTest1{
public static void main(String[] args) {
//获取系统当前的时间:
long start = System.currentTimeMillis();
boolean isFlag = true;
int count = 0;//记录质数的个数
for (int i = 2;i <= 100000;i++){ //遍历100000以内的自然数
//判定i是否是质数
for (int j = 2;j < i;j++){
if (i % j == 0){
isFlag = false;
}
}
if(isFlag){
count++;
}
//重置isFlag
isFlag = true;
}
//获取当前系统的时间:
long end = System.currentTimeMillis();
System.out.println("质数的总个数为:" + count);//9592个
System.out.println("花费的时间为:" + (end - start));//19秒
}
}
运行结果如下:
//************************************************************************************************************
/*
遍历100000以内的所有的质数。体会不同的算法实现,其性能的差别
此PrimeNumberTest2.java是实现方式2,针对于PrimeNumberTest1.java中算法的优化
*/
class PrimeNumberTest2{
public static void main(String[] args) {
//获取系统当前的时间:
long start = System.currentTimeMillis();
boolean isFlag = true;
int count = 0;//记录质数的个数
for (int i = 2;i <= 100000;i++){ //遍历100000以内的自然数
//判定i是否是质数
for (int j = 2;j <= Math.sqrt(i);j++){
if (i % j == 0){
isFlag = false;
break;//针对于非质数有效果
}
}
if(isFlag){
count++;
}
//重置isFlag
isFlag = true;
}
//获取当前系统的时间:
long end = System.currentTimeMillis();
System.out.println("质数的总个数为:" + count);//9592个
System.out.println("花费的时间为:" + (end - start));//19秒 -->加上break:1.8秒 -->加上Math.sqrt(i ):24毫秒
}
}
运行结果如下: