Pregunta

Puedo adivinar que tiene algo que ver con trabajar con el intento de larga duración sin firmar.

#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: algunos antecedentes de lo que estoy tratando de hacer:

Estoy tratando de imitar esta técnica: http://en.wikipedia.org/wiki/sieve_of_eratosthenesMientras estoy usando una matriz para almacenar un simple "es primo" 1 para sí, 0 para no. El objetivo final es resolver esto:

What is the largest prime factor of the number 600851475143 ? Listado aquí: http://procheuler.net/problem=3. Solo estoy trabajando en los primos y luego trabajaré en los factores primos.

Edit2:

Al mirar el enlace de Wikipedia que publiqué, me di cuenta de que tienen Puesdocode (se saltó eso y se le ocurrió lo que tengo) y me di cuenta de que tenía esta nota: los rangos grandes pueden no encajar completamente en la memoria. En estos casos, es necesario usar un tamiz segmentado donde solo las partes de la gama se tamizan a la vez. [14] Para rangos tan grandes que los primos de tamizado no se pueden mantener en la memoria, se usan tamices de eficiencia espacial como el de Sorenson. Por lo tanto, tendré que pensar en una forma de hacer esto utilizando un método de "tamiz segmentado".

Edición3:

Cambió la matriz para tener en cuenta el elemento [0] para que el "problema" solo se centre en que el tamaño de la memoria de la matriz sea demasiado grande para futuras referencias; También almacenó la matriz como un bool en lugar de un uint64.

¿Fue útil?

Solución

Estás tratando de asignar un uint64 gama de longitud 600851475143. Por 8 byte uint64 Eso significa que esta matriz tomará 600851475143*8byte que es más o menos 4.5TB de memoria. Incluso si su sistema puede asignar tanta memoria (poco probable), está tratando de ponerla en la pila, que generalmente tiene un tamaño ligado a solo unos pocos MB. Además, está tratando de escribir en el índice number_in_question, mientras que el último índice en la matriz es number_in_question-1.

Otros consejos

Supongo que estás soplando la pila cuando intenta crear la matriz. Ese tamaño de matriz es tremendamente grande y tendría que crearse en el montón para tener la oportunidad de tener éxito.

Su matriz tiene elementos "Number_in_Question", numerados 0 a Number_in_question - 1. Pero, su bucle para el bucle intentará acceder a Primes_Array [number_in_question], que está fuera del espacio disponible, si esa gran matriz incluso se le asignará.

¿Por qué está asignando una matriz de uint64 y almacenando 0 o 1 en cada elemento?

Editar: Además, no puede asignar una matriz en la pila con un tamaño variable como ese. Tendría que usar nuevo para asignar ese espacio en el montón. Nuevamente, suponiendo que su sistema le permitirá asignar tanto espacio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top