Frage

Die Frage ist:. Finden Sie die Summe aller Primzahlen unter 2000000

Ich habe so ziemlich das Sieb der Erastothenes Sache, und das Programm unten scheint Arbeit für kleine Zahl d definiert LIMIT als 10L 17 als Antwort erzeugt.

I eingereicht 1179908154 als Antwort, wie durch das folgende Programm erzeugt, und es war nicht korrekt.

Bitte zeigen, um das Problem aus. Danke.

#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;
}
War es hilfreich?

Lösung

Sie berechnen die Primzahlen korrekt, aber die Summe ist zu groß (mehr als 2 ^ 32) und wird nicht lange in einem unsigned 32-Bit passen. Sie können eine 64-Bit-Zahl (long long auf einigen Compiler) verwenden, um dies zu beheben.

Andere Tipps

Ihre Logik scheint korrekt zu sein, aber Sie werden mit den Datentypen vermasseln und ihre ranges.Check, ob das funktioniert oder nicht:

#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

Sie können auch feststellen, dass Sie den Compiler-Schalter verwenden müssen -std = c99 als auch. Ich habe mit gcc (GCC) 3.4.5 (mingw-vista speziellen r3) .

d.

  

gcc -Wall -std = c99 -o problem10   problem10.c

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top