码迷,mamicode.com
首页 > 其他好文 > 详细

Count Primes - LeetCode

时间:2015-05-15 07:53:07      阅读:388      评论:0      收藏:0      [点我收藏+]

标签:

examination questions

Description:

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

 

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;
}

 

关于本题的详细解题过程, 请点击这里:

解决一道leetcode算法题的曲折过程及引发的思考

 

Count Primes - LeetCode

标签:

原文地址:http://www.cnblogs.com/hlwyfeng/p/4504998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!