算法 求素数

这里我写了几个求素数的方法和大家交流一下

// ① 进行穷举 时间复杂度O(n)

 

	private static boolean primer1(int number) {
		for(int i = 2 ; i < number -1 ; i++ ){
			if(number%i == 0){
				return false ;
			}
		}
		return true;
	}

 // ② 使用 √n 进行计算 时间复杂度O(√n)

 

	private static boolean primer2(int number) {
		// 这里我们使用 i*i 而不使用 Math.sqrt(number) 因为求根是一个非常耗时的操作
		for (int i = 2; i*i<number; i++) { 
			if(number%i == 0){
				return false ;
			}
		}
		return true;
	}

  // ③ 使用爱拉托逊斯算法 充分利用了一素数的定义 如果一个数 m 是 另一个数 n 的倍数则这个数肯定不是素数 时间复杂度

 

 
 

 

	private static boolean primer3(int number) {
		boolean[] prime = new boolean[number];  
		for (int i = 2; i < prime.length - 1; i++) {
			if(!prime[i-1])
				for (int j = i - 1; j < prime.length; j += i) 
					prime[j] = true ;
		}
		return !prime[number-1];
	}

 

 /// ④ 如第三个算法 其时间复杂度已经是非常小了,但是对内存的要求确实非常大的,我们可以使用√n 的算法和爱拉托逊斯算法进行结合计算的数越大对内存的压力减少越明显

        对于2到√n 还是有很多的数是不用进行计算的 ,如 2 4 6 8 , 其中2的倍数都不用进行计算

	private static boolean primer4(int number) {
		int k = (int) Math.sqrt(number);
		boolean[] isprime = new boolean[k] ;
		for (int i = 2; i <= k; i++) {
			if(isprime[i-1]){
				if(number%i == 0)
					return false ;
				for (int j = 0; j < k; j += j) {
					isprime[j-1] = true ;
				}
			}
		}
		return true;
	}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值