Kod: Zaznacz cały
#include <iostream>
#include <cmath>
#include <conio.h>
#include <fstream>
#include <stdio.h>
#include <time.h>
typedef unsigned __int32 Lng;
void Zapisz(Lng* x, FILE* y) // dopisuje liczbę pierwszą na koniec pliku
{
fseek(y, 0, SEEK_END);
fwrite(x,sizeof(Lng),1,y);
}
bool Sprawdz(unsigned q, unsigned w, Lng* e, FILE* r) // sprawdza czy liczba pierwsza jest
{ // mniejsza od pierwiastka liczby sprawdzanej
fseek(r, ((q-1)*sizeof(Lng)), SEEK_SET);
fread(e,sizeof(Lng),1,r);
return(*e <= ceil(pow(w,0.5)));
}
void Wczytaj(unsigned a, FILE* b, Lng* c) // wczytuje daną liczbę pierwszą do zmiennej Prime
{
fseek(b, ((a-1)*sizeof(Lng)), SEEK_SET);
fread(c,sizeof(Lng),1,b);
}
int main()
{
using namespace std;
Lng u_Max; //najwyższa sprawdzana liczba
Lng u_Ile = 3; //liczba liczb pierwszych :)
Lng w_Ile = 5; //najwyższa sprawdzona liczba
Lng Prime = 2; //bufor
Lng x=0; //Liczba wyświetlanych liczb pierwszych
bool czy3; //jeśli następna sprawdzana liczba jest podzielna przez 3 powoduje jej ominięcie
bool przed3 = false; //powoduje ominięcie pierwszej liczby do sprawdzenia, jeśli jest podzielna przez 3
bool flaga = false;
cout<<"do jakiej liczby liczyc? - ";
cin>>u_Max;
cout<<endl;
cout<<"ile wyswietlac? - ";
cin>>x;
cout<<endl;
clock_t czas1 = clock();
Lng* Prm = ″
FILE *plik;
FILE *liczba;
plik=fopen("Prime.txt","rb+"); //Odczytanie plików z listą i liczbą liczb pierwszych i sprawdzonych
liczba=fopen("Number.txt","rb+");
if (liczba==NULL) {czy3 = false; flaga==true;}
if(plik==NULL){plik=fopen("Prime.txt","wb+");} //utworzenie plików z listą i liczbą liczb pierwszych i sprawdzonych
if(liczba==NULL){liczba=fopen("Number.txt","wb+");}
fseek(plik, 0, SEEK_END);
fseek(liczba, 0, SEEK_SET);
cout<<fread(&u_Ile,sizeof(Lng),1,liczba);
fseek(liczba, sizeof(Lng), SEEK_SET);
cout<<fread(&w_Ile,sizeof(Lng),1,liczba)<<endl;
if ((w_Ile%3)==0&&flaga==false){czy3 = true;}
else if ((w_Ile%3)==2){czy3 = false;}
else if ((w_Ile%3)==1){czy3 = true; przed3 = true;}
/*Jeśli sprawdzona liczba jest podzielna przez 3, przy pierwszej iteracji czy3 zmieni wartość na false,
przy 2 na true i przy trzeciej iteracji ominie sprawdzanie liczby(która jest podzielna przez 3).
Jeśli sprawdzona liczba daje resztę z dzielenia przez trzy 2, jest tak jak wyżej z tym że zaczyna się na 2 iteracji.
Jeśli sprawdzona liczba daje resztę z dzielenia przez trzy 1, wtedy pierwszą sprawdzaną liczbę trzeba ominąć(i=w_Ile+4)
i wszystko zaczyna się jak w pierwszym przykładzie.*/
if(w_Ile<=6)
{
fwrite(&Prime,sizeof(Lng),1,plik); //wprowadzenie pierwszych trzech liczb pierwszych :)
Prime=3;
fseek(plik, 0, SEEK_END);
fwrite(&Prime,sizeof(Lng),1,plik);
Prime=5;
fseek(plik, 0, SEEK_END);
fwrite(&Prime,sizeof(Lng),1,plik);
}
bool b_Prim=true;
for(Lng i=w_Ile+2+(przed3*2); i<=u_Max; i+=(czy3+1)<<1) /*sprawdzanie pierwszości liczb
(czy3=0 sprawdzanie liczby o 2 większej,
czy3=1 sprawdzanie liczby większej o 4)*/
{
b_Prim=true; //flaga
for(unsigned j=3; Sprawdz(j,i,Prm,plik); ++j) //właściwa pętla sprawdzająca
{
Wczytaj(j,plik,Prm);
if(i%Prime==0)
{
b_Prim=false; //jeśli się dzieli nie jest pierwsza
break;
}
}
if (b_Prim==true)
{
Prime=i;
Zapisz(Prm,plik); // dopisuje liczbę pierwszą na koniec pliku
++u_Ile;
}
w_Ile=i;
czy3=!czy3;
/*Wprowadzenie największej sprawdzonej liczby. właściwie można by było licznik zdefiniować wcześniej,
a największą liczbę sprawdzoną zapisać po pętli... a licznik liczb pierwszych zmienić po pętli sprawdzając rozmiar pliku.*/
}
clock_t czas2 = clock();
fseek(liczba, 0, SEEK_SET);
fwrite(&u_Ile,sizeof(Lng),1,liczba); //zapisanie w pliku danych
fseek(liczba, sizeof(Lng), SEEK_SET);
fwrite(&w_Ile,sizeof(Lng),1,liczba);
if (u_Ile<x){x=u_Ile;}
for(unsigned i=0; i<=x-1; i++) //wyświetlenie liczb pierwszych
{
Wczytaj(i+1,plik,Prm);
cout<<Prime<<endl;
}
fclose(liczba);
fclose(plik);
cout<<"ilosc liczb pierwszych - "<<u_Ile<<endl;
cout<<"gestosc - "<<static_cast<double>(u_Ile)/u_Max<<endl;
cout<<"czas: "<<czas2-czas1<<" sekund"<<endl;
cout<<"najwyzsza sprawdzona - "<<w_Ile<<" - liczba liczb pierwszych - "<<u_Ile<<endl;
getch();
}
I w związku z tym piszę ten topic. Proszę aby osoby które mają jakiś sposób na przyspieszenie tego programu i ewentualnie chciało by im się zaimplementować o wypowiedź. wszelkie pomysły jak i krytyka są mile widziane