Jeg har sat min computer og mit uforlignelige intellekt på prøve. ;-)
Skriv et program i c++, der udregner primtal.
Så mange som muligt, så hurtigt som muligt.
De omtale tal skal skrives til en fil på harddisken ikke på skærmen.
Gør koden så kort som mulig.
Der må kun bruges standard liberys/headers ect.
Her er hvad jeg er nået frem til:
#include <vector>
#include <cmath>
#include <fstream>
int main() {
std::vector<unsigned long> P(1,3);
int i;
bool is_prime;
std::ofstream primes("primes.txt",std::ios::out|std::ios::app);
primes << "2" << std::endl;
primes << P.back() << std::endl;
for (unsigned long long test = 5; test > 4; test += 2) {
for (i = 0, is_prime = true; P[i] <= sqrt(test) && is_prime == true; i++)
if (test % P[i] == 0) is_prime = false;
if (is_prime == true && test <= 0xffffffff) P.push_back(test);
if (is_prime == true) primes << P.back() << std::endl;
}
primes.close();
}
Det vigtigste man bør lægge mærke til her er at vectoren er af typen unsigned long (32 bit), men variablen test er af typen unsigned long long (64 bit), dette har naturligvis en årsag.
Når man tester om en tal er et primtal, tester man som bekendt (medmindre man bruger mystiske algoritmer og den slags) om de primtal der er mindre en tallet går op i, dog er det ikke nødvengidt at teste primtal størrer end kvardratroden at primtalet op i test tallet (det her kunne formuleres bedre)
en unsigned long long kan max indeholde værdien 2^64-1 og en unsigned long værdien 2^32-1.
Kvardratroden af førstnævnte er lig med
4294967295,9999999998835846781731
det er lige 0,9999999998835846781731 mere end en unsigned long kan indeholde, detter er naturligvis ikke et problem, da vi ikke regner med kommatal her, vi tester kun med primtal der er mindre eller er lig med kvardratroden af tallet der skal testes, så vi kan med fordel runde ned, hvilket vil sige at vi ikke har brug for at gemme primtal størrer en typen unsigned long.
Det er hvad jeg kalder effektivitet ;-)
Nuvel, jeg lod mig vist rive lidt med, hvad jeg egenlig ville hvar at udfordre alle genierne herinde til at gøre det bedre og hvis ingen skulle have lyst til at gøre et forsøg, er jeg stadig lidt utilfreds med strukturen, men hvis jeg gør som jeg gerne vil, brokker kompileren sig over at en eller anden iso standard ikke bliver overholdt.
[Redigeret d. 08/02-06 22:57:39 af Felix Nielsen][Redigeret d. 08/02-06 22:58:42 af Felix Nielsen][Redigeret d. 09/02-06 00:53:14 af Felix Nielsen]