Count Primes - LeetCode
examination questions
Description:
Count the number of prime numbers less than a non-negative number, n
References:
Please use the following function to solve the problem:
int countPrimes(int n){
}
解题代码
int countPrimes(int n) { if (n == 0 || n == 1 || n == 2){ return 0; } if (n == 3){ return 1; } int temp = 0; bool flag = false; int arr[200] = { '\0' }; int k = 0; arr[0] = 2; for (int i = 3; i < n; i++){ for (int j = 0; j <= k; j++){ if (i%arr[j] == 0){ flag = true; break; } } if (flag == false){ if (k < 199){ k++; arr[k] = i;
i++; } temp++; } else{ flag = false; } } return temp+1; }
基本算法思想
判断一个数是否是质数, 仅需判断这个数是否能被比这个数小的质数整除, 若不能, 就是质数.
代码注释分析
int countPrimes(int n) { //题目要求输入的测试值是非负数,所以必须包含0,1的特殊情况 //由于2的结果也是0,所以也包含了进去 if (n == 0 || n == 1 || n == 2){ return 0; } //为了方便后面的算法设计,要单独把3拿出来 if (n == 3){ return 1; } int temp = 0;//定义一个计数器,用来记有多少个质数 bool flag = false;//标记,用来判断该数是否是质数 int arr[200] = { '\0' };//最为基数的质数的量的最大值设置为200,可以测试10的6次方量级 int k = 0;//用来计数质数的个数的,也就是arr的下标 arr[0] = 2;//第一个质数赋值为2 for (int i = 3; i < n; i++){ //这个循环符合n>=4的情况,遍历所有小于n的数,一一进行检测 for (int j = 0; j <= k; j++){ //如果这个数能被arr[0]~arr[k]整除,说明它不是质数,flag变为true if (i%arr[j] == 0){ flag = true; break; } } if (flag == false){ //如果flag没有变成true,那么说明它是质数 if (k < 199){ //我们要求arr质数仅需要200个,超出的不计入! k++; arr[k] = i; //把这个质数也加入arr数组中 i++;//一个质数被判断为质数后,它的后面一个数字不可能是质数(除了2和3之外),所以用i++来减少对不不要数的检测 } temp++; //质数量+1 } else{ flag = false; //把flag 再初始化为false,回到最初状态,用于判断下一个数值 } } return temp + 1;//+1是因为要加上 2 这个质数,上面的temp中不包括2 }
此外, 有以下解题方法供参考(由 stevenczp 提供):
int countPrimes(int n) { bool* map = (bool*)malloc(n * sizeof(bool)); memset(map, 0, n * sizeof(bool)); for (int i = 2; i <= sqrt(n); i++) { if (map[i]) continue; int t = 2 * i; while (t < n) { map[t] = true; t += i; } } int result = 0; for (int i = 2; i < n; i++) { if (!map[i]) result++; } return result; }
关于本题的详细解题过程, 请点击这里:
作者:Tab Weng
Email:hlwyfeng(Geek)gmail.com 请将(Geek)换成@
出处:博客园 Tab Weng的博客:http://www.cnblogs.com/hlwyfeng
声明:本文采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议,允许重新传播和转载分享,但必须在正文显著位置注明署名及原文来源。
Email:hlwyfeng(Geek)gmail.com 请将(Geek)换成@
出处:博客园 Tab Weng的博客:http://www.cnblogs.com/hlwyfeng
声明:本文采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议,允许重新传播和转载分享,但必须在正文显著位置注明署名及原文来源。