【发布时间】:2021-11-27 07:07:18
【问题描述】:
我正在编写一个程序来读取整数 n (0 = n。
我的代码可以运行,但对于较大的 n,它会运行大约 10 秒。
#include <stdio.h>
#include <stdlib.h>
int isPrimeRecursive(int x, int i){
if (x <= 2){
return (x == 2 ? 1:0);
}
if (x % i == 0){
return 0;
}
if (i * i > x){
return 1;
}
return isPrimeRecursive(x, i+1);
}
int findSuccessivePrime(int x){
while (1){
x++;
if (isPrimeRecursive(x, 2)){
return x;
}
}
return 0;
}
int findGoodGap(int n, int *arr){
int prime = findSuccessivePrime(n*n);
while (1){
int gap;
int succPrime;
succPrime = findSuccessivePrime(prime);
gap = succPrime - prime;
if (gap >= n){
arr[0] = succPrime;
arr[1] = prime;
return gap;
}
prime = succPrime;
}
return 0;
}
int main(int argc, char *argv[]){
int n;
int arr[2];
scanf("%d", &n);
int goodGap;
goodGap = findGoodGap(n, arr);
printf("%d-%d=%d\n", arr[0], arr[1], goodGap);
return 0;
}
如何让程序更有效率?我只能使用 stdio.h 和 stdlib.h。
【问题讨论】:
-
您查找主号码的功能不是很有效,而且您调用了很多次。一个适当的素数筛算法可能是有用的,以及在所谓的“竞争”或“在线评判”网站上常见的另一件事(你的问题有这样一个网站的味道):动态编程,这实际上只是先前计算值的缓存。
-
只是一个小评论(我不太确定):如果你找到两个大于 N 的不同质数,它们不应该大于平方(N)吗?
-
在处理素数时,从不编写
isPrime()方法。使用 Eratosthenes 筛及其各种改进或更好的算法(如果有),一次生成所有感兴趣的素数。 -
Module primes-generator 具有您需要的所有逻辑。而且由于是 JavaScript,转换成 C++ 应该非常简单。