Inderdaad, daaraan heb je gelijk dat het mogelijk is. Maar ik vraag me af of dat uiteindelijk geheugentechnisch beter is. Ik betwijfel het dat één op de 32 natuurlijke getallen totToch nog een extra toevoeging (ik blijf er maar mee bezig): wat memory betreft kan je 8 "getallen" PER BYTE opslaan, omdat je enkel 1 of 0 zou moeten markeren als je alles in 1 keer doet (of in blokken), maar ik begrijp ook dat dat allemaal wellicht niet te implementeren valt.
\(2^31\)
een priemgetal is. Vanaf dat moment is jou oplossing geheugentechnisch goedkoper. En zelfs ook uitvoerbaar. Het betreft dan overigens alsnog altijd 256MB die je er in investeert. Al zou het kunnen dat deze oplossing goedkoper is en zelfs implementeerbaar.Bijv. zo:
Code: Selecteer alles
int main(){
unsigned int maxPrime = 1 << 31; // 2^31
unsigned char *primeTable = malloc((maxPrime / 8) * sizeof(char));
if(primeTable == NULL) return 1;
// Invoegen gaat dan zo:
unsigned int priemGetal = 99989;
primeTable[priemGetal / 8] |= 1 << (priemGetal % 8); // Zet het bit wat het nummer voorstelt op 1.
// Uitlezen gaat dan zo:
unsigned int priemGetal = 99989;
int isPriem = primeTable[priemGetal / 8] &= 1 << (priemGetal % 8);
printf(isPriem? "%u is een priemgetal" : "%u is geen priemgetal", priemGetal);
return 0;
}
Puzzels