质数是只有一和它本身才能被除尽的一类数,输出100以内的质数本质还是循环嵌套
首先,外层循环遍历100以内的自然数,因为1不是质数,所以从2开始,内层循环从1开始到自己本身结束,每个数都被i除一次,这里我们反其道而行之,我们先定义一个布尔类型的变量isFlag赋值为true,如果在内层循环的时候 i 除以 j 的时候出现了i%j==0的情况也就是出现了除了 i 自己和1以外其他的约数,就给isFlag赋值false,相当于贴了一个标签,说明当此循环的i不是质数。然后我们在接下来的判断过程中,当isFlag为true时,在外层循环里输出i的值,这样就可以输出符合条件的质数.
代码如下
import java.util.Scanner;
public class zhishu {
public static void main(String[] args)
{
long start=System.currentTimeMillis();
for(int i=2;i<=100;i++)
{
boolean isFlag=true;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
isFlag=false;
}
}
if(isFlag==true)
{
System.out.println(i);
}
}
long end=System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));
}
}
}
}
运行结果如下:
接下来是算法的优化:我们从内层循环入手,i%j==0的时候,将faluse 赋给Flag以后,说明这个数已经判断不是质数了,我们也没有判断下去的必要了,所以我们在其后加上break
代码如下:
public class zhishu1 {
public static void main(String[] args)
{
long start=System.currentTimeMillis();
for(int i=2;i<=10000;i++)
{
boolean isFlag=true;
for(int j=2;j<i;j++)
{
if(i%j==0)
{
isFlag=false;
break;
}
}
if(isFlag==true)
{
System.out.println(i);
}
}
long end=System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));
}
}
100的对比不明显,我们将数量增加到10000
结果如下
可以很明显的看到时间减少了很多
我们还可以再优化,也就是我们没必要从1到10000遍历,我们可以从1到它的平方根就可以(这里涉及数学知识,小郭不太行,等我学会了回来解释)
代码如下:
public class zhishu2 {
public static void main(String[] args)
{
long start=System.currentTimeMillis();
for(int i=2;i<=10000;i++)
{
boolean isFlag=true;
for(int j=2;j<=Math.sqrt(i);j++)
{
if(i%j==0)
{
isFlag=false;
}
}
if(isFlag==true)
{
System.out.println(i);
}
}
long end=System.currentTimeMillis();
System.out.println("所花费的时间为:"+(end-start));
}
}
结果如下
所用的时间更少了
在以后的编程中会有很多特别大的数,为了使程序能够平稳运行,我们要尽可能的进行优化.