234 countprime
来源:互联网 发布:伴奏软件手机版 编辑:程序博客网 时间:2024/06/05 15:13
- for (i=1; i<n; i++)
- {
- if (isprime(i))
- {
- count++;
- prim_vec.push_back(i);
- }
- }
- return count;
- }
判断是否是素数,最简单的代码如下,但这样提交时会超时。
- 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 来记录计算过的素数。
对素数的判断代码改进如下:
- 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;
- }
题目完整代码如下:
- 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;
- }
- };
0 0
- 234 countprime
- 234
- 234
- 234
- 234
- 234
- 234
- 234
- 234
- 234
- ocp-234
- tsiLdekniLemordnilaP.234
- LEEDCODE 234
- leetcode141&234
- 备用234
- 234D-cinema 水题被卡
- Codeforces-234C Weather
- codeforces 234G Practice
- 用Eslipse开发Android案例(1)——计算器<part1>
- 关于应用权限的问题
- Java文件流 BufferedStream
- Okhttp使用
- solr配置中文解析(分词)器
- 234 countprime
- SpringMVC初体验
- Mac系统终端命令行不执行命令 总出现command not found解决方法
- Java语言基础2
- 1016 of search
- Android Handler造成内存泄露的分析和解决
- POJ1066
- Hibernate懒加载在SSH项目中的配置及原理
- 响应式web设计