85.Count Primes

Count the number of prime numbers less than a non-negative number, n.

分析:题目的要求是求小于n的素数个数。素数的定义:大于等于2且只能被1和其本身除尽的整数。

思路:初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。

依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了。 从i*i开始排除的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了。比如排除5的倍数的时候,从5*5开始就好了,不用排除5倍之前,如5*3在前面3*5的时候已经排除过了。

在leetcode上提交通过的代码。

/**
	 * 提交通过!
	 * 思路:初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。
	 * 依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了。
	 * 从i*i开始排除的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了。
	 * 比如排除5的倍数的时候,从5*5开始就好了,不用排除5倍之前,如5*3在前面3*5的时候已经排除过了。
	 */
	public int countPrimes3(int n) {
		int totalNum = 0;
		if(n<=2){/*2是最小的素数,比2小的素数个数是0.*/
			return 0;
		}
		/*初始化一个长度为n的布尔型数组。a[i]为true表示i不是素数,为false表示i是素数。所以最后统计a[2...n]中false元素的个数即可。*/
		boolean a[] = new boolean[n];
		for(int i = 2;i*i<n;i++){
			if(!a[i]){/*依次排除2的2以上的倍数,3的3以上倍数,5的5以上倍数,7的7以上倍数等各个素数的倍数。4和6等合数在前面排除2或3的倍数的时候已经被排除过了*/
				for(int j =i;i*j<n;j++){/*从i*i开始计算的原因是,i*(i-m)在前面排除i-m的倍数的时候已经计算过了*/
					a[i*j]=true;
				}
			}
		}
		/*后统计a[2...n]中false元素的个数.*/
		for(int i = 2;i<n;i++){
			if(a[i]==false){
				totalNum++;
			}
		}
		return totalNum;
	}
提交不通过的代码,逻辑对,但是提示运行超时。

/**
	 * 提交不通过,运行超时!
	 * 给定正整数,求小于n的素数的个数。 素数的定义:大于等于2且只能被1和其本身除尽的整数。
	 * 2是最小的素数,比2小的素数个数是0.
	 * 除了2以外偶数肯定不是素数,所以只需要判断奇数即可。
	 * 虽然已经尽量减少去判断素数的次数了,但是提交的时候还是超时。
	 */
	public int countPrimes(int n) {
		int totalNum = 0;
		if(n<=2){/*2是最小的素数,比2小的素数个数是0.*/
			return 0;
		}
		totalNum++;//走到这一步说明2算一个小于n的素数。
		/*除了2以外偶数肯定不是素数,所以只需要判断奇数即可*/
		for(int i=3;i<n;i=i+2){
			if(isPrime(i)){
				totalNum++;
			}
		}
		return totalNum;
	}
/**
 * 判断 一个整数是否为素数 
 */
	public boolean isPrime(int a) {
		boolean flag = true;
		/*因为在上面我控制了传进来的a不可能是偶数,所以可以开始从3除*/
		for (int i = 3; i <= Math.sqrt(a); i++) {
			if (a % i == 0) {// 若能被整除,则说明不是素数,返回false
				flag = false;
				break;// 跳出循环
			}
		}
		return flag;
	}
	
	/**
	 * 提交不通过,运行超时!
	 * 虽然已经尽量减少去判断素数的次数了,但是提交的时候还是超时。
	 */
	public int countPrimes2(int n) {
		int totalNum = 0;
		if(n<=2){/**/
			return 0;
		}
		totalNum++;//走到这一步说明2算一个小于n的素数。
		/*除了2以外偶数肯定不是素数,所以只需要判断奇数即可*/
		for(int i=3;i<n;i=i+2){
			boolean flag = true;
			/*因为在上面我控制了传进来的a不可能是偶数,所以可以开始从3除*/
			for (int j = 3; j <= Math.sqrt(i); j++) {
				if (i % j == 0) {// 若能被整除,则说明不是素数,返回false
					flag = false;
					break;// 跳出循环
				}
			}
			if(flag){
				totalNum++;
			}
		}
		return totalNum;
	}

你可能感兴趣的:(85.Count Primes)