牛牛与素数(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;
}
};
联想公司福利 1502人发布
