Java中判断质数的方法

Java中判断质数的几种方法


说明:

1.质数:又称素数。是一个大于1的自然数(最小质数为2)。除了1和它自身外,不能被其他自然数整除的数。
=>质数:用n除[2,n-1]的所有数,不能整除就是n就是质数。

2.[2,n-1]缩小到[2,√n]效果相同

原因:判断一个n(n>1,自然数)是否是质数?
n=xy,x、y为整数,n=√n√n,此时就当x,y都等于√n,x取小于√n的某整数时,若能被n整除,得到y大于√n的某整数,也能被n整除,保持乘积还是n。x、y两个约数在√n两边。判断是否素数,需要n除[2,n-1]的所有数,使用√n分为[2,√n]和[√n,n-1],n在[2,√n]有约数,在[√n,n-1]也有约数,n在[2,√n]没有约数,在[√n,n-1]也没有约数。
其实只需要[2,√n]就能起到判断质数作用。

//求100000以内的质数?

class PrimeNumberTest {
	public static void main(String[] args) {

		//方法1
		long start = System.currentTimeMillis(); //开始时间

		for(int i = 2; i<=100000; i++){
			if(i==2){
				System.out.print(i+" ");
			}
			for(int j=2; j<=i-1; j++){
				if(i % j != 0){//不能被整除
					if(j != i-1){//不是最后一个数,继续遍历
						continue;
					}else{//是最后一个数
						System.out.print(i+" ");
						
					}
				}else{//遍历过程中,只要有一个数能被整除,跳出内循环
					break;
				}
			}
		}

		long end = System.currentTimeMillis(); //结束时间
		System.out.println("消耗时间" + (end - start));


		
		System.out.println();


		//方法2(未优化)
		long start1 = System.currentTimeMillis(); 

		for(int i=2; i<=100000; i++){
		boolean isFlag = true;
		for(int j = 2; j<=i-1; j++){
			if(i % j == 0){
				isFlag = false;
			}
		}
		if(isFlag == true){
			System.out.print(i+" ");
		}
	}

		long end1 = System.currentTimeMillis(); 
		System.out.println("消耗时间" + (end1 - start1));



	System.out.println();
	


		//方法2(优化)

		long start2 = System.currentTimeMillis(); 

		for(int i=2; i<=100000; i++){

		boolean isFlag = true;

		for(int j = 2; j<=Math.sqrt(i); j++){//优化1,对质数。[2,这个数-1]->[2,√这个数]
			if(i % j == 0){
				isFlag = false;
				break;//优化2,对非质数。在遍历是否整除过程中,只要出现整除的,立马终止循环,不除后续的数。
			}
		}
		if(isFlag == true){
			System.out.print(i+" ");
		}
		
	}

		long end2 = System.currentTimeMillis(); 
		System.out.println("消耗时间" + (end2 - start2));


    System.out.println();
	
	

	//方法3

		long start3 = System.currentTimeMillis(); 

		laber:for(int i=2; i<=100000; i++){//对这个for循环打个标签laber

		for(int j = 2; j<=Math.sqrt(i); j++){
			if(i % j == 0){
				continue laber;//不是质数,结束外层for循环的当次循环(这个数不是质数换个数继续判断)
				
			}
		}
		//执行到此处的都是质数
		System.out.print(i+" ");
		
	}

		long end3 = System.currentTimeMillis(); 
		System.out.println("消耗时间" + (end3 - start3));




	}
}

方法1:在这里插入图片描述
方法2(未优化):在这里插入图片描述
方法2(优化):在这里插入图片描述
方法3:
在这里插入图片描述

可以看出方法2(优化)执行效率最快。

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值