zoukankan      html  css  js  c++  java
  • Count Primes

    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] = { '' };
        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] = { '' };//最为基数的质数的量的最大值设置为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算法题的曲折过程及引发的思考

  • 相关阅读:
    CSS盒子模型
    getContextPath、getServletPath、getRequestURI、request.getRealPath的区别
    MYSQL中的CASE WHEN END AS
    单点登录的精华总结
    git&github
    June 21st 2017 Week 25th Wednesday
    June 20th 2017 Week 25th Tuesday
    June 19th 2017 Week 25th Monday
    June 18th 2017 Week 25th Sunday
    June 17th 2017 Week 24th Saturday
  • 原文地址:https://www.cnblogs.com/hlwyfeng/p/4504998.html
Copyright © 2011-2022 走看看