Question

Je peux prendre une proposition qu'il a quelque chose à voir avec le travail avec le unsigned 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: Un peu d'histoire de ce que je suis en train de faire:

Je suis en train d'imiter cette technique: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes alors que je suis en utilisant un tableau pour stocker un simple « est-il le premier » 1 pour oui, 0 pour non. L'objectif final est de résoudre ceci:

What is the largest prime factor of the number 600851475143 ? listés ici: http://projecteuler.net/problem=3 . Je travaille juste sur les nombres premiers et travaillera sur les principaux facteurs.

Edit2:

En regardant le lien Wikipédia I posté, je compris qu'ils ont puesdocode (sauté sur cela et est venu avec ce que j'ai) et réalisé qui avait cette note: Les grandes gammes ne peuvent pas tenir entièrement dans la mémoire. Dans ces cas, il est nécessaire d'utiliser un tamis segmenté où des portions seulement de la gamme sont tamisés à la fois. [14] Pour les plages si grand que les nombres premiers tamiser ne pouvaient pas être conservé en mémoire, tamis efficace de l'espace comme celui de Sorenson sont utilisés à la place. Par conséquent, je vais devoir penser à une façon de le faire en utilisant une méthode « tamis segmenté ».

Edit3:

Changé le tableau de compte pour le [0] élément de sorte que le « problème » est uniquement axé sur la taille de la mémoire de réseau étant trop grand pour références futures; aussi mémorisé le tableau en tant que bool au lieu d'un uint64.

Était-ce utile?

La solution

Vous essayez d'allouer un tableau de uint64 de 600851475143 de longueur. Pour 8 octets uint64 Cela signifie que ce réseau prendront 600851475143*8byte qui est plus ou moins 4.5TB de mémoire. Même si votre système peut allouer autant de mémoire (peu probable) que vous essayez d'essayer de le mettre sur la pile qui a généralement une taille liée à seulement quelques Mo. En outre, vous essayez d'écrire à l'index number_in_question, alors que le dernier indice du tableau est number_in_question-1.

Autres conseils

Je suppose votre souffle la pile quand il tente de créer le tableau. Cette taille du tableau est extrêmement important et devrait être créé sur le tas pour avoir une chance de réussir.

Your array has "number_in_question" elements, numbered 0 to number_in_question - 1. But, your for loop will try to access primes_array[number_in_question], which is outside the available space, if that large of an array will even be allocated to you.

Why are you allocating an array of uint64 and storing either 0 or 1 in each element?

Edit: also, you can't allocate an array on the stack with a variable size like that. You'd have to use new to allocate that space on the heap. Again, assuming your system will allow you to allocate that much space.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top