Ahoj, chtěl bych se zeptat jestli by mi tady nějaký schopný programátor zkontroloval můj kod. Měli jsme za ukol vytvorit eratosthenovo síto s podmínkou zachytit čísla ze spracovávané posloupnosti jako jednotlivé bity v čísle např. typu int. Mám předpokládat že typ int má 32 hodnot takže čísla 0 až 31 budou reprezentována jako bity 0 až 31 prvniho prvku pole cisel typu int, čísla 32 až 63 budou uložena jako bity 0 až 31 druhého prvku pole čísel typu int a tak dále. Dojde tedy k osminásobnému snížení pamětových nároků
Zdrojový kod jsem vytvoril takhle, zatím je to pevne nastaveno na pocítaní do 2000. Chtěl bych se tedy zeptat jestli to pracuje tak jak by melo a jak by se to popřípade melo vylepšít?
#include <iostream>
using namespace std;
int pole[2];
void NastavPrvocislo(int prvocislo)
{
int indexVpoli = prvocislo/32; //celociselne deleni
int indexVintu = prvocislo%32; //modulo - tj zbytek po celociselnem deleni
pole[indexVpoli] = pole[indexVpoli] | (1 << indexVintu); // pomoci bitoveho posunu si jednicku posunu na spravnou pozici a pomoci bitoveho OR ho nastavim
}
bool JePrvocislo(int test)
{ //true pokud je toto prvocislo nastavene
int indexVpoli = test/32;
int indexVintu = test%32;
return (pole[indexVpoli] & (1 << indexVintu)); //pomoci bitoveho posunu si jednicku posunu na spravnou pozici a pomoci bitoveho AND otestuji zda je bit nastaven
}
int main()
{
int pole[64];
int maxCislo = 2000;
NastavPrvocislo(0);
NastavPrvocislo(1); // 0 a 1 nejsou prvocisla.
for (int i = 2; i <= maxCislo; i++)
{
if (!JePrvocislo(i)) //vezmeme bit a pokud je nenastaveny, tak se jedna o prvocislo
{
cout << i << endl; // tak ho vypiseme
for (int j = 2; i * j <= maxCislo; j++) // a vsechny jeho nasobky
{
NastavPrvocislo(i * j); // nastavime, ze nejsou prvocislo.
}
}
}
return 0;
}
Fórum › C / C++
C++ eratosthenovo síto kontrola
byt tebou urcite nespoleham na to, ze bude promenna, kam ukladas, vynulovana...
dalsi vec - mohl bys rovnou osetrit dvojku podminkou a v "poli" pak vynechat vsechny jeji nasobky..
ukladat tam jen to, co muze hrat roli.. tj zacit treba 1 3 5 7 9 11 13 15 ...
proste by se vsude vesel dvojnasobek cisel
na co tam mas pak pole jako globalni? pak ho jeste pro jistotu predefinujes uvnitr main
bud nech jen globalni nebo predavej funkci
(pak to muzes pouzit jako "mnozinu")
Zjistit počet nových příspěvků
Přidej příspěvek
Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 95 hostů
Podobná vlákna
Eratosthenovo síto do souboru — založil hejnallukas
Kontrola HW — založil Petr
Kontrola id — založil Majox
Kontrola údajov — založil Michal115
Moderátoři diskuze