100以内的所有质数的输出
概述
质数:素数,只能被1和它本身的自然数整除。
从2开始,到这个数-1,都不能被这个数整除。
最小的质数是:2
第一种写法(马马虎虎写)
程序1
//100以内的所有质数的输出
public class test02 {
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++){//i被整除
if(i%j == 0 ){
isFlag = false;
}
}
if(isFlag == true){
System.out.println(i +"是质数。");
}
}
}
}
结果1
我们分析结果只有2和3因为,4数以2的时候除尽了,那么4之后的ifFlag一直是false,所以isFlag=false,所以我们得重置isFlag。
程序2
下面看修改后的程序。
//100以内的所有质数的输出
public class test02 {
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++){//i被整除
if(i%j == 0 ){
isFlag = false;
}
}
if(isFlag == true){
System.out.println(i +"是质数。");
}
//重置isFlag
isFlag = true;
}
}
}
结果2
其实isFlag还可以放在这个位置,看下面的修改的程序。
程序3
//100以内的所有质数的输出
public class test02 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值。
//获取当前时间的举例1970-01-01 00:00:00的毫秒数
long start =System.currentTimeMillis();
int count = 0;
for(int i=2;i<=100000;i++){ //遍历100以内自然数
//优化二:对本身是质数的自然数是有效的
for(int j=2; j<i; j++){ //for(int j=2; j<Math.sqrt(i); j++){//i被整除
if(i%j == 0 ){
isFlag = false;
//break;//优化一:只对本身非质数的自然数是有效的
}
}
if(isFlag == true){
//System.out.println(i +"是质数。");
count++;
}
isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:"+(end-start));//17287//优化一 加上break 1616
}
}
结果2
第二种写法(优化一 break)
加上break,优化一:只对本身非质数的自然数是有效的
//100以内的所有质数的输出
public class test02 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值。
//获取当前时间的举例1970-01-01 00:00:00的毫秒数
long start =System.currentTimeMillis();
for(int i=2;i<=100000;i++){ //遍历100以内自然数
for(int j=2; j<i; j++){//i被整除
if(i%j == 0 ){
isFlag = false;
break;//优化一
}
}
if(isFlag == true){
System.out.println(i +"是质数。");
}
isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));//17287 //加上break 1386
}
}
结果
第三种写法(优化二 外循环范围)
优化二:对本身是质数的自然数是有效的。
//100以内的所有质数的输出
public class test02 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值。
//获取当前时间的举例1970-01-01 00:00:00的毫秒数
long start =System.currentTimeMillis();
for(int i=2;i<=100000;i++){ //遍历100以内自然数
//优化二:对本身是质数的自然数是有效的
for(int j=2; j<Math.sqrt(i); j++){//i被整除
if(i%j == 0 ){
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的
}
}
if(isFlag == true){
System.out.println(i +"是质数。");
}
isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));//17287 //优化一:加上break 1386 优化二:13
}
}
结果
第四种写法(优化三 带标签的continue)
//100以内的所有质数的输出
public class test02 {
public static void main(String[] args) {
int count = 0;//记录质数的个数
//获取当前时间的举例1970-01-01 00:00:00的毫秒数
long start =System.currentTimeMillis();
label:for(int i=2;i<=100000;i++){ //遍历100以内自然数
//优化二:对本身是质数的自然数是有效的
for(int j=2; j<Math.sqrt(i); j++){//j:被i去除
if(i%j == 0 ){//i被j整除
continue label;
}
}
count++;
}
//获取当前时间的举例1970-01-01 00:00:00的毫秒数
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:"+(end-start));//17287 //优化一:加上break 1386 优化二:13 优化三:14
}
}
结果
分析
程序运行的快慢,需要的毫秒数:
17287
优化一:1386
优化二:13
优化三:14
我们可以看出,优化效果显著