C 寻找素数并添加它们的有效算法?

C 寻找素数并添加它们的有效算法?,c,algorithm,C,Algorithm,对于ProjectEulerProblem 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) {

对于ProjectEulerProblem 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);
}
#包括
内部主(空)
{
int i,j,flag,sum=0;
对于(i=3;i<2000000;i=i+2)
{
flag=0;

对于(j=3;j,在保持相同的素性测试算法的同时,这里对您的过程进行了一点改进:

  • sum
    变量设置为前两个素数的和(即2+3=5)
  • 从5开始,只测试与6的倍数相邻的数字
  • 对于每个数字,仅使用与6的倍数相邻的除数进行测试
  • 对于每个数字,仅使用5和数字平方根之间的除数进行测试
请注意,此实现提高了算法的性能,但没有提高算法的时间复杂度,并且有更有效的方法来测试素性


inti,j,iplus,jplus,flag,iroot,sum=2+3;
intiroot=(int)ceil(sqrt((float)5));
int square=iroot*iroot;

对于(i=5,iplus=2;iHint:。其他人:请不要回答这个问题。这是一个很容易回答的问题,但Euler项目的目的是学习一些东西。如果你想提供一个实际的答案,请按照Euler项目的精神来做,并将OP指向正确的方向,不要用代码(更改)来回答他。请参阅上面的评论。作为旁注,您只需检查平方根以下的可能因子,因为复合数的至少一个因子将小于或等于平方根。@LasseV.Karlsen同意,相关讨论将需要更多帮助,如何使用它???尽管它的功能对于10以下的素数是正确的,但是,如果低于200万,输出是错误的。@TooTone和#LasseV.karlse如果你想用它运行,直到它得出合乎逻辑的结论,请尝试。
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);