Непонятное решение для проблемы 10 в projecteuler - PullRequest
1 голос
/ 17 сентября 2011

Я решил проблему 10 в проекте euler (но мое решение заняло 2000 секунд), поэтому я попытался найти более быстрое решение. Я нашел это (время выполнения 0,1 сек), но я не понимаю этого решения, и мне нужна помощь.

#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
#define HIGHEST 2000000

char Prime[HIGHEST / 2];

int main(int argc, char** argv)
{
   unsigned int i, j;
   unsigned long long sum = 2;
   unsigned int total = 0;

   /* Set entire array to true (prime) */
   memset(Prime, 1, sizeof(char)*HIGHEST / 2);
   /* except for 1 */
   Prime[0] = 0;

   for(i = 3; i < HIGHEST; i += 2) {
      if(Prime[i / 2] == 1) {
         sum += (unsigned long long)i;
         total++;
      }
      for(j = (i+i+i)/2; j < HIGHEST/2; j += i) {
         Prime[j] = 0;
      }
   }
   printf("Sum: %llu (%d prime numbers)\n", sum, total);
   return 0;
}

1 Ответ

3 голосов
/ 17 сентября 2011

Решение представляет собой несколько странную версию Решета Эратосфена.Похоже, что автор пытался преждевременно оптимизировать, выполняя некоторые хитрые трюки со счетчиком циклов, i.

Я предлагаю вам пройти первые несколько итераций цикла на бумаге, чтобы почувствоватьчто делает код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...