用于查找素数并添加它们的高效算法?

时间:2014-04-05 18:58:08

标签: c algorithm

对于项目euler问题10,我们应该添加所有素数,但这需要我的计算机多年才能完成。需要更高效的算法! 继承了我目前的C代码:

#include <stdio.h>

int main(void) 
{
int i, j, flag, sum=0;
for(i=3; i< 2000000; i = i + 2)
{
  flag=0;
  for(j=3; j<=i/2; j = j + 2)
  {
    if(i%j==0)
    {
      flag=1;
      break;
    }
  }
  if(flag==0)
    sum += i;
 }
printf ("%i", sum + 2);
}

1 个答案:

答案 0 :(得分:0)

这是对你的程序的一个小改进,同时保持相同的算法来测试素数:

  • sum变量设置为前两个素数之和(即2 + 3 = 5)
  • 从5开始,仅测试与6的倍数相邻的数字
  • 对于每个数字,仅使用与6
  • 的倍数相邻的除数进行测试
  • 对于每个数字,仅使用5和数字平方根之间的除数进行测试

请注意,此实现改进了算法的性能,但不提高算法的时间复杂度,并且有更有效的方法来测试素数。< / p>


int i, j, iplus, jplus, flag, iroot, sum = 2+3;

int iroot  = (int)ceil(sqrt((float)5));
int square = iroot*iroot;

for (i=5, iplus=2; i<2000000; i+=iplus, iplus=4-iplus)
{
    flag = 0;
    if (square < i)
    {
        iroot++;
        square = iroot*iroot;
        // instead of calculating the square root of the number every time,
        // calculate it at the beginning, and increment it only when needed
    }
    for (j=5, jplus=2; j<=iroot; j+=jplus, jplus=4-jplus)
    {
        if (i%j == 0)
        {
            flag = 1;
            break;
        }
    }
    if (flag == 0)
        sum += i;
}

printf("%i", sum);