本文主要是介绍234. countprime,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[cpp] view plain copy print?
int countPrimes(int n) {
int i =0, count=0;
- for (i=1; i<n; i++)
- {
- if (isprime(i))
- {
- count++;
- prim_vec.push_back(i);
- }
- }
- return count;
- }
判断是否是素数,最简单的代码如下,但这样提交时会超时。
[cpp] view plain copy print?
- bool isprime(int n)
- {
- if (n < 2)
- return false;
- if (n ==2 )
- return true;
- int tmp = sqrt(n);
- for (int i=1; i<tmp; i++)
- {
- if (n % i == 0)
- return false;
- }
- return true;
- }
对算法进行改进,将判断能否被小于sqrt(n)的数整除,改为能否被小于sqrt(n)的素数整除,可以节省很多计算量,大大减少计算的次数。这样就需要将以前计算的素数都记下来,所以使用一个全局的vector prim_vec 来记录计算过的素数。
对素数的判断代码改进如下:
[cpp] view plain copy print?
- vector<int> prim_vec;
- bool isprime(int n)
- {
- if (n < 2)
- return false;
- if (n == 2)
- return true;
- if(n %2 == 0)
- return false;
- int sq = sqrt(n);
- int len = prim_vec.size();
- for (int index=0; index<len;index++)
- {
- int tmp = prim_vec[index];
- if(tmp > sq)
- break; //这句如果不加,也会TLE
- if (n % tmp == 0)
- return false;
- }
- return true;
- }
题目完整代码如下:
[cpp] view plain copy print?
- class Solution {
- public:
- vector<int> prim_vec;
- bool isprime(int n)
- {
- if (n < 2)
- return false;
- if (n == 2)
- return true;
- if(n %2 == 0)
- return false;
- int sq = sqrt(n);
- int len = prim_vec.size();
- for (int index=0; index<len;index++)
- {
- int tmp = prim_vec[index];
- if(tmp > sq)
- break;
- if (n % tmp == 0)
- return false;
- }
- return true;
- }
- int countPrimes(int n)
- {
- int i =0, count=0;
- for (i=1; i<n; i++)
- {
- if (isprime(i))
- {
- count++;
- prim_vec.push_back(i);
- }
- }
- return count;
- }
- };
这篇关于234. countprime的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!