请给出素数筛的C语言代码
时间: 2023-05-21 18:02:44 浏览: 60
以下是素数筛的C语言代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, j;
printf("请输入一个正整数n:");
scanf("%d", &n);
int *prime = (int*)malloc(sizeof(int) * (n + 1));
for (i = 2; i <= n; i++)
{
prime[i] = 1;
}
for (i = 2; i * i <= n; i++)
{
if (prime[i])
{
for (j = i * i; j <= n; j += i)
{
prime[j] = 0;
}
}
}
printf("2~%d之间的素数有:\n", n);
for (i = 2; i <= n; i++)
{
if (prime[i])
{
printf("%d ", i);
}
}
printf("\n");
free(prime);
return 0;
}
注意:这只是一个简单的素数筛实现,可能存在效率问题,更高效的算法可以参考其他资料。
相关问题
请给出素数筛的C语言代码并加以详细注释
以下是素数筛的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 1000000
bool is_prime[MAX_N + 1];
void sieve(int n) {
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;
}
}
}
}
int main() {
int n;
printf("请输入一个正整数n:");
scanf("%d", &n);
sieve(n);
printf("小于等于%d的素数有:", n);
for (int i = 2; i <= n; i++) {
if (is_prime[i]) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
```
注释如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 1000000 // 定义最大范围
bool is_prime[MAX_N + 1]; // 定义一个数组,用于标记是否为素数
void sieve(int n) { // 素数筛函数
for (int i = 2; i <= n; i++) { // 初始化,将所有数标记为素数
is_prime[i] = true;
}
for (int i = 2; i * i <= n; i++) { // 从2开始,枚举小于等于sqrt(n)的素数i
if (is_prime[i]) { // 如果i是素数
for (int j = i * i; j <= n; j += i) { // 将i的倍数标记为非素数
is_prime[j] = false;
}
}
}
}
int main() {
int n;
printf("请输入一个正整数n:");
scanf("%d", &n);
sieve(n); // 调用素数筛函数
printf("小于等于%d的素数有:", n);
for (int i = 2; i <= n; i++) { // 输出所有小于等于n的素数
if (is_prime[i]) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
```
希望能够帮到你!
生成一个素数筛的c语言代码
### 回答1:
以下是一个生成素数筛的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void sieve_of_eratosthenes(int n) {
bool *prime = (bool *) malloc((n+1) * sizeof(bool));
for (int i = 0; i <= n; i++) {
prime[i] = true;
}
for (int p = 2; p*p <= n; p++) {
if (prime[p] == true) {
for (int i = p*p; i <= n; i += p) {
prime[i] = false;
}
}
}
printf("2 ");
for (int p = 3; p <= n; p += 2) {
if (prime[p] == true) {
printf("%d ", p);
}
}
}
int main() {
int n = 100; // 生成小于等于100的素数
printf("小于等于%d的素数有:\n", n);
sieve_of_eratosthenes(n);
return 0;
}
```
该代码使用了埃拉托色尼筛选法(sieve of Eratosthenes),该算法首先将所有数标记为素数,然后从2开始枚举,将所有的倍数标记为合数。最后输出所有标记为素数的数即为所求。
### 回答2:
以下是一段使用C语言编写的生成素数筛的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void sieveOfEratosthenes(int n) {
bool isPrime[n+1];
// 默认所有数都是素数
for (int i = 2; i <= n; i++) {
isPrime[i] = true;
}
// 标记非素数
for (int p = 2; p * p <= n; p++) {
if (isPrime[p]) {
for (int i = p * p; i <= n; i += p) {
isPrime[i] = false;
}
}
}
// 输出素数
for (int p = 2; p <= n; p++) {
if (isPrime[p]) {
printf("%d ", p);
}
}
}
int main() {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
printf("从2到%d之间的素数为:\n", n);
sieveOfEratosthenes(n);
return 0;
}
```
这段代码首先使用bool数组`isPrime`来记录每个数字是否是素数。我们使用标记法来筛选出素数,将2到n之间的所有数都初始化为素数。然后从2开始,遍历到`p * p <= n`的所有数字,如果这个数字是素数,那么将其所有的倍数标记为非素数,最后输出素数。在主函数中,首先接收用户输入的正整数n,然后调用`sieveOfEratosthenes`函数来输出从2到n之间的素数。
### 回答3:
以下是一个生成素数筛的C语言代码:
#include <stdio.h>
#include <stdbool.h>
void primeSieve(int n) {
bool isPrime[n+1];
for (int i = 0; i <= n; i++) {
isPrime[i] = true;
}
for (int p = 2; p * p <= n; p++) {
if (isPrime[p] == true) {
for (int i = p * p; i <= n; i += p) {
isPrime[i] = false;
}
}
}
printf("素数筛结果:\n");
for (int p = 2; p <= n; p++) {
if (isPrime[p]) {
printf("%d ", p);
}
}
}
int main() {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
primeSieve(n);
return 0;
}
在这个代码中,我们首先定义了一个名为 primeSieve 的函数,它接受一个整数 n 作为输入。我们使用一个布尔数组 isPrime 来表示每个数是否为素数。初始时,我们将所有的数都标记为素数(值为 true)。
接下来,我们从 2 开始遍历到 n 的平方根,并检查每个数是否为素数。如果一个数 p 是素数,那么它的倍数一定不是素数,所以我们将 p 的所有倍数标记为非素数(值为 false)。
最后,我们遍历 isPrime 数组,并输出其中值为 true 的数,即为素数。
在主函数中,我们首先读取用户输入的正整数 n,然后调用 primeSieve 函数来生成素数筛结果。
希望对你有所帮助!