从输出质数思考算法

题目:输出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倍

结论:一个好的程序要用合适的存储结构 极佳的算法

        合适的存储结构:尽量少开辟新的内存空间

        极佳的算法:优化计算算法

       

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值