C++ eratosthenovo síto kontrola – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

C++ eratosthenovo síto kontrola – C / C++ – Fórum – Programujte.comC++ eratosthenovo síto kontrola – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
bon0010
~ Anonymní uživatel
3 příspěvky
21. 11. 2010   #1
-
0
-

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;
}

Nahlásit jako SPAM
IP: 89.31.8.–
Reklama
Reklama
KIIV+42
God of flame
21. 11. 2010   #2
-
0
-

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")

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
bon0010
~ Anonymní uživatel
3 příspěvky
21. 11. 2010   #3
-
0
-

To KIIV : Jsem si vědom toho že jsem tam nasekal spoustu chyb právě proto se ptám jak to opravit. Hlavně mi šlo o to jestli jsem vůbec splnil podmínku že se mi ty výsledky ukládají jako jednotlivé bity.

Nahlásit jako SPAM
IP: 89.31.8.–
bon0010
~ Anonymní uživatel
3 příspěvky
21. 11. 2010   #4
-
0
-

No teď jsem se dočetl, že si mám dopředu nadeklarovat pole int čísel delky 32 768 a při vlastním vypočtu si jen pamatovat do jaké hodnoty prvočísla počítáme, třeba do 100, jak by se to provedlo?

Nahlásit jako SPAM
IP: 89.31.8.–
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žit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 122 hostů

Podobná vlákna

Eratosthenovo síto do souboru — založil hejnallukas

Kontrola HW — založil Petr

Kontrola id — založil Majox

Kontrola — založil jiri.free

Kontrola vstupu — založil mickey

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý