注释中有详解:
/*
100以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。
最小的质数是:2
*/
class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
for(int i = 2;i <= 100;i++){//遍历100以内的自然数
for(int j = 2;j < i;j++){//j:被i去除
if(i % j == 0){ //如果i被j除尽,则i可以被非1和它本身的数除尽,所以不为质数
isFlag = false;//这个i不为素数的标志
}
}
//
if(isFlag == true){//isFlag == true则所对应的i为质数,输出
System.out.println(i);
}
//重置isFlag
isFlag = true;
}
}
}
优化后的:
/*
1000以内的所有质数的输出。实现方式一
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。
对PrimeNumberTest.java文件中质数输出问题的优化
*/
class PrimeNumber {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
for(int i = 2;i <= 1000;i++){//遍历1000以内的自然数
//优化二:
//for(int j = 2;j < i;j++){//优化前
for(int j = 2;j <= Math.sqrt(i);j++){//(优化后)j:被i去除
//Math.sqrt(i)是指根号i的值,j <= Math.sqrt(i)与j < i效果一致但效
//率更高运算次数更少,具体原因不做多讲解,可b站找个视频,打字讲解太麻烦了
if(i % j == 0){ //i被j除尽
isFlag = false;
break;//优化一:一旦发现i可以被非1和它本身的数整除,说明其为非质素,用break
//跳出内循环,执行下一轮
}
}
//
if(isFlag == true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
System.out.println("质数的个数为:" + count);
}
}
方法二:
/*
100000以内的所有质数的输出。实现方式二
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。
对PrimeNumberTest.java文件中质数输出问题的优化
*/
class PrimeNumberTest2 {
public static void main(String[] args) {
int count = 0;//记录质数的个数
label:for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除
if(i % j == 0){ //i被j除尽
continue label;
}
}
//能执行到此步骤的,都是质数
count++;
}
System.out.println("质数的个数为:" + count);
}
}