Могу предположить, что это как-то связано с работой с unsigned long long int.
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
typedef unsigned long long int uint64;
int main(int argc, char *argv[])
{
uint64 number_in_question = 600851475143LL;
long double sqrt_in_question = sqrt(number_in_question);
bool primes_array[number_in_question+1];
for (uint64 i = 0; i <= number_in_question; i++) {
primes_array[i] = true;
}
for (uint64 i = 2; i <= sqrt_in_question; i++) {
if(primes_array[i] == true) {
// for every multiple of this prime, mark it as not prime
for (uint64 ii = i*2; ii <= number_in_question; ii += i) {
primes_array[ii] = false;
}
}
}
for (uint64 i = 0; i <= number_in_question; i++) {
if(primes_array[i] == true)
cout << i << ", ";
}
system("PAUSE");
return EXIT_SUCCESS;
}
Edit1: Некоторые предпосылки того, что я пытаюсь сделать:
Я пытаюсь имитировать эту технику: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes, в то время как я использую массив для хранения простого "простое ли это" 1 для да, 0 для нет.Конечная цель состоит в том, чтобы решить это:
What is the largest prime factor of the number 600851475143 ?
Перечислено здесь: http://projecteuler.net/problem=3. Я просто работаю над простыми числами, а затем буду работать над простыми множителями.
Edit2:
Просмотрев ссылку на Википедию, которую я разместил, я понял, что у них есть puesdocode (пропущенный по этому поводу и придумал то, что у меня есть) и понял, что у него есть следующее примечание: большие диапазоны могут не полностью уместиться в памяти.В этих случаях необходимо использовать сегментированное сито, где за один раз просеиваются только части диапазона. [14]Для диапазонов, настолько больших, что простые сита не могут быть сохранены в памяти, вместо этого используются сита с эффективным использованием пространства, такие как сито Соренсона.Поэтому мне нужно будет придумать способ сделать это, используя метод «сегментированное сито».
Edit3:
Изменен массив для учета элемента [0], поэтому «проблема»фокусируется только на том, что объем памяти массива слишком велик для будущих ссылок;также сохранял массив как логическое значение вместо uint64.