【问题标题】:How to make a C program run faster? [closed]如何让 C 程序运行得更快? [关闭]
【发布时间】:2017-02-06 17:13:11
【问题描述】:

我要计算0到N区间内的素数个数。问题是当N>100000时程序运行很慢。

int main(){

long int  i, j, n,isPrime;
long int N, count;

N = 10000000;



count = 0;
for(i = 2; i <= N; i++){
    isPrime = 0;

    for(j = 2; j <= i/2; j++){

         if(i % j == 0){
            isPrime = 1;

             break;
         }
    }
     if(isPrime==0 && N!= 1)


     /*printf("%d ",i);*/
     if(isPrime==0 && N!= 1)
    count++;

}

    printf(" %li ", count);     
   getch();
   return 0;
 }

【问题讨论】:

  • 我们不是代码审查网站。
  • 首先考虑一个算法,例如Sieve of Eratosthenes。它将为您提供一些关于是什么使算法或多或少高效的见解。

标签: c


【解决方案1】:

您不必上i/2 来查找素数,只需查找平方根即可。任何大于平方根的除数都没有用:您之前已经找到了对应的除数。

int sqr = int(sqrt(i));  // make sure it is computed only once
for(j = 2; j <= sqr; j++){

应该这样做......

或者(按照建议)比较正方形以避免计算 sqrt

for(j = 2; j*j <= i; j++){

这种方法很好地找出一个大数是否是素数。但是要找到一系列素数,最好使用Sieve of Erathostenes 算法(我已经链接了 C 版本)。

【讨论】:

  • j*j &lt;= i 的计算速度比j &lt;= int(sqrt(i)) 快。但修复算法是比调整此实现更好的起点。
  • 确实如此。编辑。
  • 我会在循环之前保存 sqrt() 结果,并在循环中检查。
  • @donjuedo 我也想过。但优化器可能会解决这个问题
  • “可能”是这里的关键词。乘法不是免费的,j 一直在变化。尽管如此,我认为你的回答还是不错的。
【解决方案2】:

一方面,这一行:

for(i = 2; i <= N; i++){

i=2 开始,然后转到:

i=3
i=4
i=5
i=6
i=7

为什么要检查 4、6 和 8 之类的值?
您可以立即跳过这些值!

将你的行改为:

for(i = 3; i <= N; i+=2){   /* Start at 3, then 5, 7, 9, 11, etc. */

【讨论】:

    【解决方案3】:

    不要使用取模运算。使用筛子。

    static unsigned char sieve[10000000] = {0};
    
    long countprimes(long N)
    {
        long answer = 0;
        long i;
        long j = 2;
        long rootN = ceil(sqrt(N)); 
        while(j < rootN)
        {
           for(i=j+j;i<N;i+=j)
              sieve[i] = 1;
            j++;
            while(sieve[j])
               j++;
    
        }
        for(i=2;i<N;i++)
           if(!sieve[i])
              answer++;
        return answer;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2017-03-19
      • 2018-08-23
      • 2017-08-05
      • 2021-05-11
      • 1970-01-01
      相关资源
      最近更新 更多