注: 以下三句计算时间效率用的,和计算过程无关
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
System.out.println(end-start); //程序用时,单位毫秒
一、基本
class Test{
public static void main(String [] args){
// 质(素)数 只能被1和它本身整数的自然数
// 即从2到这个数减1,都不能比这个数整数
// 最小的质数是2
long start = System.currentTimeMillis();
boolean isPrime = true; // 质数的标志
for(int i = 2; i <= 100; i++){ //遍历2到100的每个数
for(int j = 2; j <= i-1; j++){ // 对上述遍历的每个数,再找出2到这个数减1进行遍历
if(i % j == 0){ // 如果能找到一个被除尽
isPrime = false; // 那么就不是质数,isPrime置为false
}
}
if(isPrime){ //对每一个数,走了一圈isPrime还是true,就说明是质数了
System.out.println(i);
}
isPrime = true; //对每一个数重置标志
}
long end = System.currentTimeMillis();
System.out.println(end-start); //程序用时,单位毫秒
}
}
二、break优化
class Test{
public static void main(String [] args){
// 质(素)数 只能被1和它本身整数的自然数
// 即从2到这个数减1,都不能比这个数整数
// 最小的质数是2
long start = System.currentTimeMillis();
boolean isPrime = true; // 质数的标志
for(int i = 2; i <= 100; i++){ //遍历2到100的每个数
for(int j = 2; j <= i-1; j++){ // 对上述遍历的每个数,再找出2到这个数减1进行遍历
if(i % j == 0){ // 如果能找到一个被除尽
isPrime = false; // 那么就不是质数,isPrime置为false
//**************LOOK HERE**********
break; //找到一个因子就足以说明是质数了
//**************LOOK HERE**********
}
}
if(isPrime){ //对每一个数,走了一圈isPrime还是true,就说明是质数了
System.out.println(i);
}
isPrime = true; //对每一个数重置标志
}
long end = System.currentTimeMillis();
System.out.println(end-start); //程序用时,单位毫秒
}
}
三、开方优化
class Test{
public static void main(String [] args){
// 质(素)数 只能被1和它本身整数的自然数
// 即从2到这个数减1,都不能比这个数整数
// 最小的质数是2
long start = System.currentTimeMillis();
boolean isPrime = true; // 质数的标志
for(int i = 2; i <= 100000; i++){ //遍历2到100的每个数
//**************LOOK HERE*************
for(int j = 2; j <= Math.sqrt(i); j++){ // 从2到根号i即可
// 粗略原因: 比如100可以被2除尽,那就不需要被50除了,能被4除尽,则不需要被25除
// 可以得出这个数的根号就是分界点,比这个数根号小的数都除不尽,则比其大的同样不行
// 目前没有很搞清楚这个点,以后想到了再补充
//**************LOOK HERE*************
if(i % j == 0){ // 如果能找到一个被除尽
isPrime = false; // 那么就不是质数,isPrime置为false
break; //找到一个因子就足以说明是质数了
}
}
if(isPrime){ //对每一个数,走了一圈isPrime还是true,就说明是质数了
System.out.println(i);
}
isPrime = true; //对每一个数重置标志
}
long end = System.currentTimeMillis();
System.out.println(end-start); //程序用时,单位毫秒
}
}
四、continue指定循环优化(代码简洁)
class Test{
public static void main(String [] args){
// 质(素)数 只能被1和它本身整数的自然数
// 即从2到这个数减1,都不能比这个数整数
// 最小的质数是2
long start = System.currentTimeMillis();
label:for(int i = 2; i <= 100000; i++){ //遍历2到100的每个数
for(int j = 2; j <= Math.sqrt(i); j++){ // 从2到根号i即可
if(i % j == 0){ // 如果能找到一个被除尽
continue label; //找到一个因子就跳过该次循环,进入下一个i
}
}
System.out.println(i); //能执行到这里的i都是质数了
}
long end = System.currentTimeMillis();
System.out.println(end-start); //程序用时,单位毫秒
}
}