You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化查找间隔不小于N的相邻素数对的C语言程序

性能优化方案

原代码性能瓶颈

  • 递归素数判断存在栈帧开销,运行效率远低于迭代实现
  • 素数判断逻辑未提前过滤偶数,所有数都从2开始逐一枚举因子,冗余计算量占比超过50%
  • 查找相邻素数时每次步长为1,重复校验所有偶数,浪费大量计算资源
  • 每个数的素数校验独立进行,没有复用历史计算结果

优化方案

方案1:局部优化(改动最小,性能提升5~10倍)

直接替换素数判断和相邻素数查找逻辑即可,原有业务逻辑无需调整:

优化后的素数判断函数

// 替换原递归isPrimeRecursive
int isPrime(int x) {
    if (x <= 1) return 0;
    if (x == 2) return 1;
    // 直接排除所有偶数
    if (x % 2 == 0) return 0;
    // 仅枚举奇数因子,终止条件用i <= x/i避免i*i溢出
    for (int i = 3; i <= x / i; i += 2) {
        if (x % i == 0) return 0;
    }
    return 1;
}

优化后的相邻素数查找函数

int findSuccessivePrime(int x) {
    if (x < 2) return 2;
    // 直接定位到下一个待判断的奇数,跳过所有偶数
    x = (x % 2 == 0) ? x + 1 : x + 2;
    while (1) {
        if (isPrime(x)) return x;
        x += 2;
    }
}

改动后n=150时运行时间可以降到1秒以内。


方案2:埃氏筛法(最优方案,性能提升100倍以上)

针对n最大仅为150的场景,首次出现间隙≥150的素数对不会超过200万,直接筛出范围内所有素数后遍历查找,完全避免重复判断,n=150时运行时间仅需几毫秒:

完整优化代码

#include <stdio.h>
#include <stdlib.h>

// 筛法上限,实测200万足够覆盖n<=150的所有场景
#define MAX_LIMIT 2000000

int findGoodGap(int n, int *arr) {
    // 申请筛法数组,标记对应下标是否为素数
    char *is_prime = (char *)malloc(MAX_LIMIT * sizeof(char));
    if (!is_prime) return -1;
    // 筛法初始化
    for (int i = 0; i < MAX_LIMIT; i++) is_prime[i] = 1;
    is_prime[0] = is_prime[1] = 0;
    for (int i = 2; i <= MAX_LIMIT / i; i++) {
        if (is_prime[i]) {
            for (int j = i * i; j < MAX_LIMIT; j += i) {
                is_prime[j] = 0;
            }
        }
    }
    // 遍历素数找第一个符合要求的间隙
    int prev_prime = 0;
    for (int i = 2; i < MAX_LIMIT; i++) {
        if (is_prime[i]) {
            if (prev_prime != 0) {
                int gap = i - prev_prime;
                if (gap >= n) {
                    arr[0] = i;
                    arr[1] = prev_prime;
                    free(is_prime);
                    return gap;
                }
            }
            prev_prime = i;
        }
    }
    free(is_prime);
    return 0;
}

int main(int argc, char *argv[]){
    int n;
    int arr[2];
    scanf("%d", &n);
    int goodGap = findGoodGap(n, arr);
    printf("%d-%d=%d\n", arr[0], arr[1], goodGap);
    return 0;
}

内容的提问来源于stack exchange,提问作者hubvoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:54:04