题目:
10000以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数。
初级代码:
package codetest;
/*100以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数。
*/
public class PrimeNumberTest1 {
public static void main(String[] args) {
for(int i=2;i<=10000;i++) {
boolean isFlag=true;
for (int j=2;j<i;j++) {
if(i%j==0) {
isFlag=false;
}
}
if(isFlag==true) {
System.out.println(i);
}
}
}
}
优化一:在if循环体中加一个break,在判断i能否被j除尽时,如果i被某一个j除尽就说明它不是质数,可以不用做此j以后的判断了
代码:
package codetest;
/*100以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数。
对质数的优化
*/
public class PrimeNumberTest2 {
public static void main(String[] args) {
long start=System.currentTimeMillis();
for(int i=2;i<=10000;i++) {//遍历10000以内的自然数
boolean isFlag=true;//标识i是否被j除尽,一旦除尽,修改其值。
for (int j=2;j<=Math.sqrt(i);j++) {//j被i去除//优化二
if(i%j==0) {//i被j除尽
isFlag=false;
break;//优化一:只对本身非质数的自然数是有效的
}
}
if(isFlag==true) {
System.out.println(i);
}
}
//获取当前时间距离1970-01-01 00:00:00的毫秒数
long end=System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));//209 优化一:break:43
}
}
优化二: ①将 i(被除数)开根号,这样就可以减少运算次数。i 只需除以2到 i1/2中间的数。利用到了Math.sqrt(i)函数 意思是 i1/2
②利用continue 函数加标签。若 i 有一个除了1和它本身之外的因子,则说明它不是质数,直接执行下一次循环,判断 i+1。
代码:
package codetest;
public class PrimeNumberTest3 {
public static void main(String[] args) {
long start=System.currentTimeMillis();
label:for(int i=2;i<=10000;i++) {
for(int j=2;j<=Math.sqrt(i);j++) {
if(i%j==0) {
continue label;
}
}System.out.println(i);
}
long end=System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));//209 优化一:break:43 //优化二:根号:16
}
}