C语言代码质数筛(埃氏筛))
时间: 2023-07-10 14:41:04 浏览: 150
好的,以下是C语言代码实现质数筛(埃氏筛):
```c
#include <stdio.h>
#define MAX 1000000
int prime[MAX + 1];
void sieve()
{
for(int i = 2; i <= MAX; i++)
{
prime[i] = 1;
}
for(int i = 2; i * i <= MAX; i++)
{
if(prime[i])
{
for(int j = i * i; j <= MAX; j += i)
{
prime[j] = 0;
}
}
}
}
int main()
{
sieve();
for(int i = 2; i <= MAX; i++)
{
if(prime[i])
{
printf("%d ", i);
}
}
return 0;
}
```
该代码使用了埃氏筛法,首先初始化一个数组`prime`,然后将2~MAX之间的数都标记为质数(即`prime[i] = 1`),接着从2开始遍历,将素数的倍数都标记为非质数(即`prime[j] = 0`),最后输出所有标记为质数的数。
希望对你有帮助!
相关问题
c语言埃氏筛法判断素数
以下是使用C语言实现埃氏筛法判断素数的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool is_prime(int n) {
if (n <= 1) {
return false;
}
bool *is_prime = (bool *)malloc(sizeof(bool) * (n + 1));
for (int i = 2; i <= n; i++) {
is_prime[i] = true;
}
for (int i = 2; i * i <= n; i++) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j += i) {
is_prime[j] = false;
}
}
}
bool result = is_prime[n];
free(is_prime);
return result;
}
int main() {
int n = 17;
if (is_prime(n)) {
printf("%d is a prime number.\n", n);
} else {
printf("%d is not a prime number.\n", n);
}
return 0;
}
```
该程序首先判断输入的数是否小于等于1,如果是,则直接返回false,因为1不是素数。然后使用动态数组is_prime来记录每个数是否为素数,初始化时将所有数都标记为素数。接下来从2开始遍历到n,如果当前数是素数,则将其所有倍数都标记为非素数。最后返回is_prime[n]的值,即n是否为素数。
用c语言代码实现埃式筛法和欧拉筛法
埃氏筛法(Sieve of Eratosthenes)是一种找出一定范围内所有质数的经典算法,它通过从2开始,每次将当前未标记的合数的倍数都标记为合数,直到遍历到平方根。下面是C语言实现的一个简单版本:
```c
#include <stdio.h>
#include <math.h>
void eratosthenes(int n) {
int prime[n+1];
for (int i = 0; i <= n; i++)
prime[i] = 1;
for (int p = 2; p * p <= n; p++) {
if (prime[p]) {
for (int i = p * p; i <= n; i += p)
prime[i] = 0;
}
}
printf("Prime numbers below %d are:\n", n);
for (int p = 2; p <= n; p++)
if (prime[p])
printf("%d ", p);
}
int main() {
int n = 50;
eratosthenes(n);
return 0;
}
```
而欧拉筛法(Euler's Sieve)则更为高效,可以同时找出范围内的所有互质数。这里给出一个简化版的C代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// Function to store sieve and count of co-primes
#define MAX 1000001
int sieve[MAX], phi[MAX];
void eulersieve() {
for (int i = 2; i < MAX; i++) {
if (!sieve[i]) {
for (int j = i; i*j < MAX; j++) {
sieve[i*j] = 1;
phi[i*j] += phi[j]; // phi(n) is sum of phi(p) for all primes p dividing n
}
phi[i] = i - sieve[i]; // phi(i) for prime 'i'
}
}
}
int main() {
eulersieve();
int n = 50;
printf("Prime numbers and their counts of co-primes below %d are:\n", n);
for (int i = 2; i <= n; i++) {
if (!sieve[i]) {
printf("%d has %d co-primes\n", i, phi[i]);
}
}
return 0;
}
```
阅读全文
相关推荐














