【问题标题】:Why do I fail Project Euler #10?为什么我会失败 Project Euler #10?
【发布时间】:2010-12-31 14:53:16
【问题描述】:

问题是:求200万以下的所有素数之和。

我几乎做了 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;
}

【问题讨论】:

  • 已通过将 long 替换为 long long 并将 %lu 替换为 %llu 修复
  • 我很高兴我回答了这个问题,我为此度过了许多沮丧的日子! +1

标签: c sieve-of-eratosthenes


【解决方案1】:

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

【讨论】:

  • 谢谢。是的,我只是假设 long unsigned 对于任何目的来说已经太大了。傻我
  • 你会时不时遇到这种情况;大数有很多欧拉问题。有时你可以巧妙地避免使用long long 甚至无限类型;有时你不能。
【解决方案2】:

您的逻辑似乎是正确的,但您搞砸了数据类型及其范围。检查这是否有效:

#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

【讨论】:

    【解决方案3】:

    您可能还会发现您还需要使用编译器开关-std=c99。我使用 gcc (GCC) 3.4.5 (mingw-vista special r3)

    gcc -Wall -std=c99 -o 问题10 问题10.c

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2015-07-28
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多