问题是:在下面找到2000000所有素数的总和

我非常确实的Erastothenes事情的筛上,和下面的方案似乎对于小数目的工作即定义LIMIT为10L产生17的答案。

我提交1179908154作为答案,如由下面的程序产生的,并且它是不正确的。

请帮忙指点出了问题。感谢。

#include <stdio.h>

#define LIMIT 2000000L
int i[LIMIT];

int main()
{
    unsigned long int n = 0, k, sum = 0L;
    for(n = 0; n < LIMIT; n++)
        i[n] = 1;
    i[0] = 0;
    i[1] = 0;

    unsigned long int p = 2L;

    while (p*p < LIMIT)
    {
        k = 2L;
        while (p*k < LIMIT)
        {
            i[p*k] = 0;
            k++;
        }
        p++;
    }

    for(n = 0; n < LIMIT; n++)
        if (i[n] == 1)
        {
            sum += n;
        }
    printf("%lu\n",sum);

    return 0;
}
有帮助吗?

解决方案

您正确计算的素数,但总和过大(超过2 ^ 32),并且将不适合在一个无符号的32位长。可以使用一个64位的数(在一些编译器long long)解决此问题。

其他提示

您的逻辑似乎是正确的,但你的数据类型搞乱他们ranges.Check是否该作品与否:

#include <stdio.h>

#define LIMIT 2000000
int i[LIMIT];

int main()
 {
   long long int n = 0, k, sum = 0;
  for(n = 0; n < LIMIT; n++)
    i[n] = 1;
  i[0] = 0;
  i[1] = 0;

  long long int p = 2;

  while (p*p < LIMIT)
  {
    k = 2;
    while (p*k <LIMIT)
    {
        i[p*k] = 0;
        k++;
    }
    p++;
  }

  for(n = 0; n < LIMIT; n++)
    if (i[n] == 1)
    {
        sum += n;
    }
  printf("%lld\n",sum);

  return 0;
}

Output :142913828922

您也可能会发现,你需要使用编译器开关的 -std = C99 为好。我与的 GCC(GCC)3.4.5(mingw的-远景特殊R3)

即。

  

GCC -Wall -std = C99 -o problem10   problem10.c

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top