题目:输出10W以内的质数:
1.按照普通的逻辑思维编写:
public class Test {
public static void main(String []args)
{
long ti1 = System.currentTimeMillis();// 从当前时间到1970.1.1 00:00:00的时间距离(ms)
int i,j; // i代表10w待判断的数,j代表待判断的依据
boolean flag = true;
for(i = 2;i <= 100000;i++)
{
for(j = 2;j < i;j++)
{
if(i % j == 0)
{
flag == false;// 当存在除尽的情况时,赋值为false
}
}
if(flag == true)
{
System.out.println(i);
}
flag = true;//如果上一层的判断结果不是质数,那么flag=false,到下一个循环时即使是质数flag == true 的判断结果也是假 所以需要重新赋值true
}
long ti2 = System.currentTimeMillis();
System.out.println(ti1 - ti2); // 17000ms
}
}
2.优化一
public class Test02 {
public static void main(String[] args) {
long ti1 = System.currentTimeMillis(); //从初始化开始到1970.1.1 00:00:00 的距离 单位ms
boolean flag = true;
int i,j; // i代表0-10W的数 j代表的是待判断的数从2到本身减1中间所有的数
for(i = 2;i <= 100000;i++)
{
for(j = 2;j <= i - 1;j++)
{
if(i % j == 0){
flag = false;
break;// 优化一:加入break 减少比较次数 但对于质数的判断效率没有作用
}
}
if(flag == true)
System.out.println(i);
flag = true;
}
long ti2 = System.currentTimeMillis();// 5557ms
System.out.println(ti2 - ti1);
}
}
3.优化二:
public class Test {
public static void main(String []args)
{
long ti1 = System.currentTimeMillis();// 从当前时间到1970.1.1 00:00:00的时间距离(ms)
int i,j; // i代表10w待判断的数,j代表待判断的依据
boolean flag = true;
for(i = 2;i <= 100000;i++)
{
for(j = 2;j < Math.sqrt(i);j++)// i.Math.sqrt()开平方
{
if(i % j == 0)
{
flag == false;// 当存在除尽的情况时,赋值为false
break;
}
}
if(flag == true)
{
System.out.println(i);
}
flag = true;//如果上一层的判断结果不是质数,那么flag=false,到下一个循环时即使是质数flag == true 的判断结果也是假 所以需要重新赋值true
}
long ti2 = System.currentTimeMillis();
System.out.println(ti1 - ti2); // 17ms
}
}
4.优化三:利用带标签的continue
public class Test {
public static void main(String []args)
{
long ti1 = System.currentTimeMillis();// 从当前时间到1970.1.1 00:00:00的时间距离(ms)
int i,j; // i代表10w待判断的数,j代表待判断的依据
int x = 0;
for1:for(i = 2;i <= 100000;i++)
{
for(j = 2;j < Math.sqrt(i);j++)// i.Math.sqrt()开平方
{
if(i % j == 0)
{
continue for1;
}
}
System.out.println(x);
}
long ti2 = System.currentTimeMillis();
System.out.println(ti1 - ti2); // 17ms
}
}
解析:在对每一个i判断时,判断范围缩小为根号i,效果一样 对质数的效率也有提升
i=X*Y 当i/X=Y i/Y=X 当一个数可以被整除时 不用判断两遍
当X增大时,Y减小 直到 i数除于X=X
所以从数学的角度来说:只需要判断从2到根号i就可以了
这种算法极大的提高了效率 如图所示: 17ms 相较于第一种算法 提高了10^3倍
结论:一个好的程序要用合适的存储结构 极佳的算法
合适的存储结构:尽量少开辟新的内存空间
极佳的算法:优化计算算法