C程序优化/速度提升

时间:2015-10-16 21:13:42

标签: c performance primes

作为初学者,我创建了一个程序,用于查找不高于输入自然数(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;
}

2 个答案:

答案 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