初级算法之数学:计数质数

计数质数

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

思路:
(1)首先想到依次从2遍历到n-1,每个数检验是否为质数的方法:是否会被2~sqrt(n)整除。时间复杂度O(n*n)
(2)采用空间换时间的思想。设一个数组记录是否为质数(初始化都为质数),然后每遇到一个质数,count++,并将该质数的所有倍数全标记为非质数,耗时仍然较长。
(3)在(2)的基础之上,划分为了两大步骤:A、将数组中所有的质数与非质数标注出来,因此只可在2~sqrt(n)中,便可将所有的非质数全都标记出来 B、遍历数组,找出质数个数

思路1

	public int countPrimes(int n) {
		int count = 0;
		for (int i = 2; i < n; i++) {
			int flag = 1;
			for (int j = 2; j <= Math.sqrt(i); j++) {
				if (i % j == 0) {
					flag = 0;
					break;
				}
			}
			if (flag == 1)
				count++;
		}
		return count;
	}

思路三

	public int countPrimes(int n) {
		if(n<=2) return 0;
		int count = 0;
		int prime[] = new int[n+1];//0表是质数,1表非质数
		for(int i=2;i<Math.sqrt(n);i++) {
			if(prime[i]==0) {//是质数
				for(int j=i;j*i<n;j++) {//所有倍数都为非质数
					prime[j*i] = 1;
				}
			}
		}
		for(int i=2;i<n;i++) {
			if(prime[i]==0) {
				count++;
			}
		}
		return count;
	}

猜你喜欢

转载自blog.csdn.net/qq_41220834/article/details/86592692
今日推荐