Почему я привожу Euler № 10 Проекта к сбою?

Вопрос: Найдите сумму всех начал ниже 2 миллионов.

Я в значительной степени сделал Решето вещи Erastothenes, и программа ниже, кажется, работает на небольшое число т.е. определяет ПРЕДЕЛ, поскольку 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;
}
11
задан iCodez 22 January 2015 в 20:40
поделиться

3 ответа

Вы правильно вычисляете праймы, но сумма слишком велика (более 2^32) и не поместится в беззнаковую 32-битную длину. Для исправления можно использовать 64-битное число (long на некоторых компиляторах).

.
8
ответ дан 3 December 2019 в 10:26
поделиться

Ваша логика кажется правильной, но вы путаете типы данных и их диапазоны. Проверьте, работает это или нет:

#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;
}

Выход :142913828922

1
ответ дан 3 December 2019 в 10:26
поделиться

Вы также можете обнаружить, что вам также нужно использовать переключатель компилятора -std = c99 . Я сделал это с gcc (GCC) 3.4.5 (mingw-vista special r3) .

т.е.

gcc -Wall -std = c99 -o проблема10 проблема10.c

0
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: