牛牛与素数(2)题解

牛牛与素数(2)

https://www.nowcoder.com/questionTerminal/1033cb51ef754f25aefd8057b534286c

牛牛想知道[7,n)内有多少素数,只不过他不知道怎么做,所以他想请你帮忙。
给定一个数字n,返回[7,n)内有多少素数。

题解:模拟即可,只不过如果使用以下方式不断去计算判断素数还是有点慢的,复杂度O(n^2),时间上不可接受。

    string solve(int n) {
        // write code here
        int num = n * 7;
        for (int i = 2; i <= int(sqrt(num)); i++)
        {
            if (n % i == 0)
            {
                return "NO";
            }
        }
        return "YES";
    }

我们可以用一个更快的方法,埃氏筛法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。用另外一个数组去存储我们找到的素数,最后我们查询一下那个数组即可。
当然对于本题,最快的方法还是打表啦。。打表可以到O(n)
时间复杂度:图片说明
空间复杂度:图片说明
参考代码:

class Solution {
public:
    bool is_prime_small[1000009];
    bool is_prime[1000009];
    void segment_sieve(int a, int b)
    {
        for (int i = 0; i * i <= b; i++)
            is_prime_small[i] = true;
        for (int i = 0; i < b - a; i++)
            is_prime[i] = true;
        for (int i = 2; i * i <= b; i++)
            if (is_prime_small[i])
            {
                for (int j = 2 * i; j * j <= b; j += i)
                    is_prime_small[j] = false;
                for (int j = max(2, (a + i - 1) / i) * i; j < b; j += i)
                    is_prime[j - a] = false;
            }
    }
    /**
     * 给定一个数字n,返回[7,n)内有多少素数。
     * @param n int整型 代表题目中的n
     * @return int整型
     */
    int solve(int n)
    {
        // write code here
        int c;
        segment_sieve(7, n);
        int ans = 0;
        c = n - 7;
        for (int i = 0; i < c; i++)
        {
            if (is_prime[i])
                ans++;
        }
        return ans;
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务