C语言如何实现getprime获取素数?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

C语言实现获取素数(GetPrime)

在C语言中,获取素数(质数)通常有两种常见方法:一种是判断单个数是否为素数,另一种是生成一定范围内的所有素数(如埃拉托斯特尼筛法)。

c语言getprime
(图片来源网络,侵删)

方法1:判断单个数是否为素数

#include <stdio.h>
#include <stdbool.h>
#include <math.h>
// 判断一个数是否为素数
bool isPrime(int num) {
    if (num <= 1) {
        return false;
    }
    if (num == 2) {
        return true;
    }
    if (num % 2 == 0) {
        return false;
    }
    // 只需检查到平方根即可
    for (int i = 3; i <= sqrt(num); i += 2) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}
int main() {
    int num;
    printf("请输入一个整数: ");
    scanf("%d", &num);
    if (isPrime(num)) {
        printf("%d 是素数\n", num);
    } else {
        printf("%d 不是素数\n", num);
    }
    return 0;
}

方法2:使用埃拉托斯特尼筛法生成素数

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
// 使用埃拉托斯特尼筛法生成n以内的所有素数
void getPrimes(int n) {
    if (n < 2) {
        printf("没有素数\n");
        return;
    }
    // 创建并初始化标记数组
    bool *isPrime = (bool *)malloc((n + 1) * sizeof(bool));
    for (int i = 0; i <= n; i++) {
        isPrime[i] = true;
    }
    isPrime[0] = isPrime[1] = false;
    // 筛法过程
    for (int p = 2; p * p <= n; p++) {
        if (isPrime[p]) {
            for (int i = p * p; i <= n; i += p) {
                isPrime[i] = false;
            }
        }
    }
    // 输出所有素数
    printf("%d以内的素数有:\n", n);
    for (int p = 2; p <= n; p++) {
        if (isPrime[p]) {
            printf("%d ", p);
        }
    }
    printf("\n");
    free(isPrime);
}
int main() {
    int n;
    printf("请输入一个整数n: ");
    scanf("%d", &n);
    getPrimes(n);
    return 0;
}

方法3:优化后的筛法(空间优化)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
// 优化的筛法,只处理奇数
void getPrimesOptimized(int n) {
    if (n < 2) {
        printf("没有素数\n");
        return;
    }
    int size = (n - 1) / 2;
    bool *isPrime = (bool *)malloc(size * sizeof(bool));
    for (int i = 0; i < size; i++) {
        isPrime[i] = true;
    }
    // 筛法过程
    for (int p = 3; p * p <= n; p += 2) {
        if (isPrime[(p - 1) / 2]) {
            for (int i = p * p; i <= n; i += 2 * p) {
                isPrime[(i - 1) / 2] = false;
            }
        }
    }
    // 输出素数
    printf("%d以内的素数有:\n", n);
    printf("2 "); // 2是唯一的偶素数
    for (int p = 3; p <= n; p += 2) {
        if (isPrime[(p - 1) / 2]) {
            printf("%d ", p);
        }
    }
    printf("\n");
    free(isPrime);
}
int main() {
    int n;
    printf("请输入一个整数n: ");
    scanf("%d", &n);
    getPrimesOptimized(n);
    return 0;
}
  1. 判断单个数是否为素数:适用于需要检查特定数字的情况,时间复杂度为O(√n)
  2. 埃拉托斯特尼筛法:适用于生成一定范围内的所有素数,时间复杂度为O(n log log n)
  3. 优化筛法:通过只处理奇数来节省空间,适用于大范围素数生成

选择哪种方法取决于你的具体需求,如果只需要检查几个数,第一种方法更简单;如果需要生成大量素数,后两种方法更高效。

c语言getprime
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
织梦移动到二级目录后如何访问?
« 上一篇 04-14
百度织梦小程序模板如何快速搭建?
下一篇 » 04-14

相关文章

取消
微信二维码
支付宝二维码

目录[+]