C语言编程代码质数筛(欧拉筛
时间: 2023-08-11 15:36:29 浏览: 50
以下是 C 语言实现欧拉筛的代码:
```c
#include <stdio.h>
#include <stdbool.h>
const int N = 1000010;
int prime[N], cnt;
bool st[N];
void get_primes(int n)
{
for (int i = 2; i <= n; i++)
{
if (!st[i]) prime[cnt++] = i;
for (int j = 0; prime[j] <= n / i; j++)
{
st[prime[j] * i] = true;
if (i % prime[j] == 0) break;
}
}
}
int main()
{
int n;
scanf("%d", &n);
get_primes(n);
for (int i = 0; i < cnt; i++) printf("%d ", prime[i]);
return 0;
}
```
其中 `N` 表示筛选的范围,`prime` 数组存储筛出的质数,`st` 数组标记每个数是否为合数,`cnt` 表示质数的个数。在 `get_primes` 函数中,我们从小到大枚举每个数,如果该数是质数,则将其所有的倍数标记为合数,最终得到所有质数。
相关问题
欧拉筛法求素数c语言代码
好的,欧拉筛法求素数的C语言代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 1000000
int primes[MAX_N]; // 存储素数
bool is_prime[MAX_N+1];
int sieve(int n)
{
int p = 0;
for (int i = 0; i <= n; ++i) {
is_prime[i] = true;
}
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
primes[p++] = i;
for (int j = i * 2; j <= n; j += i) {
is_prime[j] = false;
}
}
}
return p;
}
int main()
{
int n = 100;
int count = sieve(n);
printf("The number of primes less than or equal to %d is %d.\n", n, count);
printf("The primes are:\n");
for (int i = 0; i < count; ++i) {
printf("%d\n", primes[i]);
}
return 0;
}
```
欧拉筛法的主要思想是:在每次筛数的过程中,用已有的素数来筛掉比它大的素数及其倍数。这样可以避免重复筛数,提高算法效率。
具体实现时,我们可以先用一个bool型数组is_prime来标记每个数是否是素数。从2开始遍历到n,如果当前数是素数,就把它作为新的素数,并把它的倍数标记为非素数。最后把所有素数存入primes数组中。
上述代码中,sieve()函数返回的是数组primes中存储的素数个数。对于n=100的情况,输出的结果如下:
```
The number of primes less than or equal to 100 is 25.
The primes are:
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```
c语言的欧拉筛法怎么写
### 回答1:
C语言中欧拉筛法的实现方法是:首先初始化长度为 n+1 的 bool 数组 s,其中 s[0] 和 s[1] 均为 false,s[2] 开始全部设为 true;然后从 2 开始遍历到比 n 小的最大素数,如果 s[i] 为 true,则将 s[2*i] 至 s[n] 均设为 false。遍历完成后,s[i] 为 true 的 i 即为素数。
### 回答2:
欧拉筛法是一种用于求解素数的算法,它能够高效地找出一定范围内所有的素数。下面是用C语言实现欧拉筛法的代码:
```c
#include <stdio.h>
#define MAXN 1000000
int isPrime[MAXN+1];
void sieveOfEratosthenes(int n) {
// 将isPrime数组中所有的元素初始化为1
for (int i = 0; i <= n; i++) {
isPrime[i] = 1;
}
isPrime[0] = isPrime[1] = 0; // 0和1不是素数
// 从2开始进行筛选
for (int i = 2; i * i <= n; i++) {
if (isPrime[i] == 1) {
// 将i的倍数标记为非素数
for (int j = i * i; j <= n; j += i) {
isPrime[j] = 0;
}
}
}
}
int main() {
int n;
printf("请输入一个整数n:");
scanf("%d", &n);
sieveOfEratosthenes(n);
printf("小于等于%d的所有素数有:", n);
for (int i = 2; i <= n; i++) {
if (isPrime[i] == 1) {
printf("%d ", i);
}
}
return 0;
}
```
这段代码中,首先定义了一个用于标记素数的数组isPrime,长度为n+1。然后通过sieveOfEratosthenes函数,将所有的元素初始化为1,表示都是素数。接下来,将0和1标记为非素数。然后使用两个嵌套循环,从2开始筛选素数。如果某个数i是素数,则将其所有的倍数标记为非素数。最后,根据isPrime数组中的标记结果,输出小于等于n的所有素数。
### 回答3:
欧拉筛法是一种用来快速找出一定范围内所有素数的算法。以下是一个用C语言实现欧拉筛法的示例代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 1000000
void eulerSieve(int n) {
bool isPrime[MAX_SIZE];
for (int i = 0; i <= n; i++) {
isPrime[i] = true;
}
for (int p = 2; p * p <= n; p++) {
// 如果p是素数
if (isPrime[p] == true) {
// 将p的倍数标记为非素数
for (int i = p * p; i <= n; i += p) {
isPrime[i] = false;
}
}
}
// 输出所有素数
printf("素数:");
for (int p = 2; p <= n; p++) {
if (isPrime[p]) {
printf("%d ", p);
}
}
printf("\n");
}
int main() {
int n;
printf("请输入一个正整数n:");
scanf("%d", &n);
eulerSieve(n);
return 0;
}
```
在这个代码中,我们先定义了一个大小为`MAX_SIZE`的布尔数组`isPrime`,用于记录是否是素数。然后我们将数组中所有元素初始化为`true`,表示都先假设是素数。
接下来,我们从2开始遍历到n,如果当前遍历到的数p是素数,则将其倍数(2p, 3p, 4p...)标记为非素数,即将对应的`isPrime`数组元素改为`false`。
最后,我们遍历`isPrime`数组,找出所有为`true`的索引,即为素数,并输出。
这样,通过欧拉筛法,我们可以快速找出给定范围内的所有素数。