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算法题的曲折过程及引发的思考

  • 相关阅读:
    成功并不是要得到什么,而是要放弃什么
    Qt一步一步实现插件通信(附源码)
    Qt一步一步实现插件调用(附源码)
    推荐大家阅读——《你的知识需要管理》
    移动商机十人谈__移动红利
    如果再不要求进步,那么你就是下一个陨落的巨头
    贫穷的本质__如何改变穷人的现状?
    贫穷的本质__缺乏对未来的信心和长远规划
    痛苦并愉快的被洗着_品牌洗脑
    Qt_Pro详解
  • 原文地址:https://www.cnblogs.com/hlwyfeng/p/4504998.html
Copyright © 2011-2022 走看看