Ja det går stærk, nu er minsanten kommet endnu en opdatering, men jeg har også en hel del spørsmål jeg ønsker besvaret, men først koden.
#include <iostream>
#include <deque>
#include <cmath>
#include <fstream>
#include <iterator>
std::deque<unsigned long> read_primes() {
std::deque<unsigned long> P;
std::ifstream primes("primes.txt",
std::ios::in|
std::ios::binary);
if (primes){
copy(std::istream_iterator<unsigned long>(primes),
std::istream_iterator<unsigned long>(),
back_inserter(P));
P.pop_front();
}
else {
primes.close();
P.push_back(3);
std::ofstream primes("primes.txt",
std::ios::out|
std::ios::binary|
std::ios::app);
primes << "2" << std::endl;
primes << P.back() << std::endl;
}
primes.close();
return P;
}
int main() {
std::deque<unsigned long>P;
unsigned long long i;
double root;
bool is_prime;
std::cout << "Reading primes from file... ";
P = read_primes();
std::cout << "Done!" << std::endl;
std::cout << P.size()+1 << " primes read from file" << std::endl;
std::cout << "press enter to start the search";
std::cin.get();
std::cout << "Searching for primes between " << P.back() << " and 18446744073709551615... ";
std::ofstream primes("primes.txt",
std::ios::out|
std::ios::binary|
std::ios::app);
for (unsigned long long test = P.back() + 2; test != 1; test += 2) {
root = sqrt(test);
for (i = 0, is_prime = true; P[i] <= root && 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();
std::cout << "Done!" << std::endl;
std::cout << P.size()+1 << " primes was found between 0 and 18446744073709551615";
std::cin.get();
}
1)
Jeg har læst at functionen 'copy()' er defineret i headeren 'algoritm', er det rigtigt? Det fungerer jo fint for mig uden, men hvis vi antager at jeg ikke tager fejl, ville det så ikke være mest hensigtsmægsigt at includere denne header selvom jeg reelt ikke bruger den?
2)
Som det kan læses af koden læser og skriver jeg nu til disken binært, dette skulle spare en hel del plads, men jeg er kommet i tvivl på et par punkter.
2.1)
De tal den læser fra start bliver inlæst fint og uden problemer, men jeg har endnu ikke brugt grænsen der hedder 0xffffffff, så det er der jo ikke noget at sige til, men når jeg når så langt, er det så ikke muligt at det kan skabe problemer? Jeg mener disse iteratorer der bliver brugt er jo af typen unsigned long, hvad vil der ske hvis den prøver at indlæse en værdi som typen ikke kan indeholde?
2.2)
Under alle omstændigheder har jeg brug for at sætte en stop klods så den ikke kan indlæse værdier der er størrer end den type som dequen er defineret som, men hvordan?
Vil dette løse ovenstående problem?
2.3)
Disse parametre som bliver brugt i forhold til istream og ostream; er det evt. nogen af den jeg kan undvære, eller er der mon nogen jeg mangler? Det virker, men derfor kan jeg jo godt have gjort en fejl.
2.4)
Jeg har fået denne besked fra en nyhedsgruppe:
---
Note, if you go with a binary file the same file won't necessarily work
on all platforms (hint: lookup "endian".) There are things you can do to
fix that...
---
Jeg har gjort som foreslået, men er ikke blevet klogere, er det nogen jeg reelt bør bekymre mig om når filen kun skal bruges på den platform den er kompileret til?
Hvis ja, ()også gerne hvis nej) er der en der evt. ved hvad det handler om og kan forklare lidt?
3)
Fra samme nyhedsgruppe:
---
You don't need a deque, or any other kind of container for prime
numbers. Primes are already a sequence, and you can represent them with an iterator.
---
Jeg er nogenlunde sikker på at jeg forstår meningen med ovenstående, men...
Er det korrekt?
Er det for avanceret for mig?
På forhånd tak, håber at få nogle gode/interessante svar.