可以用C++给我生成质数筛的代码吗
时间: 2023-05-23 09:04:43 浏览: 73
A:当然可以,以下是基于C的质数筛代码:
```c
#include<stdio.h>
#define MAX 1000000
int prime[MAX / 32 + 1];
int is_prime(int x)
{
// 查找 x % 32 的值
int offset = x & 31;
// 查找 x 在数组中的索引值,等效于 x / 32
int index = x >> 5;
// 判断索引值是否为质数,等效于 (prime[index] & (1 << offset)) != 0
return (prime[index] >> offset) & 1;
}
void set_prime(int x)
{
int offset = x & 31;
int index = x >> 5;
// 打标记
prime[index] |= 1 << offset;
}
void sieve(int n)
{
// 预处理所有的奇数位
int i, j;
for (i = 1; i <= n / 2; i++) {
if (!is_prime(i)) {
// 判断 i 是否为质数
int k = i * 2 + 1; // 转换为对应的奇数位
for (j = k * k / 2; j <= n / 2; j += k) {
// 将 k 的倍数打上标记
set_prime(j);
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
sieve(n);
// 输出所有的质数
printf("2 ");
int i;
for (i = 1; i <= n / 2; i++) {
if (!is_prime(i)) {
printf("%d ", i * 2 + 1); // 转换为对应的奇数位
}
}
return 0;
}
```
其中,使用 bitset 的方法可以有效地压缩数组的大小,使用移位运算代替除法运算可以提高程序的效率。
阅读全文