【LeetCode】(204)Count Primes(Easy)

题目


Count Primes

  Total Accepted: 27781  Total Submissions: 139375 My Submissions

Description:

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







解析


就是判断n以内,不包含n的素数有多少个。

先贴出我的代码

class Solution {
public:
    int countPrimes(int n) {
         vector<bool> isPrimer(n+1,true);
	for (int i = 2; i*i < n; i++)
	   for (int j = i*i; j < n;j = j+ i)
		isPrimer[j] = false;
		   
<span style="white-space:pre">	</span>int ret = 0;
	for (int i = 2;i<n;i++)
	{
	  if (isPrimer[i])
	      ret++;
	}
	 return ret;
    }
};

其实思路就是按照提示的来的

把提示也贴出来


比如100,先建立101个bool值的vector,第0元素没用,其实100也可以,我就是想正好对齐。表示下标位是否是一个素数。

我们从2开始,把2的倍数都去掉,标识为非素数,同理遍历后面的数字,但是不用全部遍历,因为n如果有sqrt(n)以上的数字分解,那么也必然有sqrt(n)以下的数字,那么会在前面的数字就标识好,不用浪费空间。

说一下如何把2的倍数去掉这一详细的流程。我们是从2*2开始遍历,然后不断加2,这些数字全部都是2的倍数,可以标为非素数。

同理,如果是3,则从9开始。为什么需要从i*i开始呢?这是因为i到i*i之间的数字如果可以分解,那么必然有小于i的因式,那么必然在遍历到i之前就已经判断它是非素数了,不用重复判断。

这个方法是官方的提示,但是却耗时很多,有点想不明白为什么,难道比别人一个个遍历还耗时?

参考了一下别人的,应该是自己从vector中去寻找有几个true时太耗时了。改正后代码如下

class Solution {
public:
    int countPrimes(int n) {
		   vector<bool> isPrimer(n+1,true);
		   int ret = 0;

		   for (int i = 2; i < n; i++)
		   {
			   if (isPrimer[i])
			   {
				   if (i<sqrt(n))
				   {
					   for (int j = i*i; j < n;j = j+ i)
						   isPrimer[j] = false;
				   }
				   ret++;
			   }
		   }
		   return ret;
    }
};
就是从2遍历到n,找到标记为质数的数去对他的倍数变为非质数,并统计质数个数。















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值