【问题标题】:C program optimization/speed increaseC程序优化/提速
【发布时间】:2015-10-16 21:13:41
【问题描述】:

作为一个初学者,我编写了一个程序来查找不大于输入自然数 (x) 的素数 (prime) 的数量。该程序运行良好(我认为),但我想让它运行得更快(对于更高的数字)。有没有可能,如果有,怎么做?

#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;
}

【问题讨论】:

  • 1:找到更好的算法。 2. 对于您当前的算法,请注意只有一个偶素数。 3.对于你当前的算法,注意如果你没有在第一个sqrt(n)数字中找到除数,n是素数。
  • 为目前找到的每个素数创建一个列表或数组。仅将它们作为除数进行测试。如果23 已经成为除数,那么测试6 是否是除数是没有意义的。
  • 查看埃拉托色尼筛。您可以在此基础上构建更高效的算法。
  • @WeatherVane 很好。我会尝试实现这个
  • 不确定这是否足以提高速度,但您可以将if (flag==1){prime++;} 替换为prime+=flag; 并且您可以在flag=0; 之后添加break;

标签: c performance primes


【解决方案1】:

您的算法会进行试除法,这很慢。 2000 年前的埃拉托色尼筛法是一种更好的算法:

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

【讨论】:

  • 应该for i from p*p to n step pfor i from p+p to n step p
  • @WillNess 是的,我明白了...p+p2 处理。 p+p+p3 照顾,等等。
【解决方案2】:

有一个著名的素数定理。它指出

π(n)≈n/ln(n)

但是有一些算法可以计算这个函数。按照链接: PNT

Computing π(x): The Meissel, Lehmer, Lagarias, Miller, Odlyzko method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多