Java求n以内的所有质数

本文探讨了如何使用Java找出一个数n以内的所有质数,介绍了三种不同的方法,包括基本定义求解、优化到只判断到平方根以及利用质数规律优化。通过结果分析,尽管方法三理论上更快,但在实际应用中,由于需要遍历列表,方法二在大多数情况下(直到10^9)表现更优,因此推荐使用优化后的方法二作为最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。

方法1:根据质数的定义求解;

方法2:对方法1作进一步优化,仅需判断到该数的平方根;

方法3:基于规律除了2,所有的质数都是奇数;如果一个数不能被它之前的质数整除,那么这个数是质数”进一步优化程序。

示例程序如下:

package test;

import java.util.ArrayList;
import java.util.List;

public class FindPrime {

	public static void main(String[] args) {
		long time = System.nanoTime();
		System.out.println(findPrime1(10000).size());
		System.out.println(System.nanoTime() - time);
		
		time = System.nanoTime();
		System.out.println(findPrime2(10000).size());
		System.out.println(System.nanoTime() - time);
		
		time = System.nanoTime();
		System.out.println(findPrime3(10000).size());
		System.out.println(System.nanoTime() - time);
	}

	public static List<Integer> findPrime1(int n) {
		List<Integer> primes = new ArrayList<Integer>();
		primes.add(2);
		for(int i = 3; i <= n; i++) {
			for(int j = 2; j < i; j++) {
				if(i % j == 0)	break;
				if(j == i-1)	primes.add(i);
			}
		}
		return primes;
	}

	public static List<Integer> findPrime2(int n) {
		List<Integer> primes = new ArrayList<Integer>();
		primes.add(2);
		for(int i = 3; i <= n; i++) {
			int tmp = (int)Math.sqrt(i) + 1;
			for(int j = 2; j <= tmp; j++) {
				if(i % j == 0)	break;
				if(j == tmp)	primes.add(i);
			}
		}
		return primes;
	}

	public static List<Integer> findPrime3(int n) {
		List<Integer> primes = new ArrayList<Integer>();
		primes.add(2);
		for(int i = 3; i <= n; i+=2) {
			for(int j = 0; j < primes.size(); j++) {
				if(i % primes.get(j) == 0)	break;
				if(j == primes.size() - 1) { primes.add(i); break; }
			}
		}
		return primes;
	}

}
运行结果截图:


结果分析:

大家针对这个结果或许感到有点奇怪,为什么方法三会比方法二慢?虽然方法三理论上快点,但是方法三需要遍历list,而方法二不需要。除非当这个n特别大(我测到10^9,还是方法二优)时,不然方法二都是优于方法三的。所以我们认为最好的方法是:方法二 + 优化“除了2,所有的质数都是奇数”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值