如何优化查找间隔不小于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
相关产品推荐
相关产品推荐

