作为初学者,我创建了一个程序,用于查找不高于输入自然数(prime
)的素数(x
)。该程序工作正常(我认为),但我想让它更快地工作(对于更高的数字)。是否可能,如果可以,怎么样?
#include <stdio.h>
int main() {
int x, i, j, flag = 1, prime = 0 ;
scanf("%d", &x);
for (i = 2; i <= x; i++) {
j = 2;
while (flag == 1 && j < i/2 + 1 ) {
if (i % j == 0) {
flag = 0;
}
j++;
}
if (flag == 1) {
prime++;
}
flag = 1;
}
printf("%d\n", prime);
return 0;
}
答案 0 :(得分:1)
您的算法会进行试验分割,这很慢。一个更好的算法是2000年历史的Eratosthenes筛选:
function primes(n):
sieve := makeArray(2..n, True)
for p from 2 to n
if sieve[p]
output p # prime
for i from p*p to n step p
sieve[i] := False
我会留给你翻译成C.如果你想了解更多,我谦虚地在我的博客上推荐文章Programming with Prime Numbers。
答案 1 :(得分:0)
有一个着名的素数定理。它说明了
π(n)≈n/ln(n)
但是有一些计算这个功能的算法。点击链接: PNT
Computing π(x): The Meissel, Lehmer, Lagarias, Miller, Odlyzko method