Jump to content

C++ Pāris jautājumi.


Remus
 Share

Recommended Posts

2 Nexodus

mozh

string ca;

vietā ieliec

char ca[250];

vai, ko līdzīgu :roll: vispār tā tikai tāda doma...

Link to comment
Share on other sites

Guest bljaaviens

Gljuks, man galiigi nepatiik tas kvadratsakne tur...

EDIT: tagad patiik. aizmirsu, ka ir taada lieta kaa lokaalie mainigie...

Link to comment
Share on other sites

Guest bubu

Ja a^2 = b, tad (a+1)^2 = a^2+2a+1 = b+2a+1

Tātad, kad izrēķini kvadrātu, tad lai dabūtu nākamo ņem to kvadrātu pieskaiti divkāršotu pašu skaitli un vēl +1.

Link to comment
Share on other sites

AndzX8-842
Nu, pag! Debug modee vinjsh tiishaam sajaaj kodu, iekljaujot tajaa lielu cjupu ar Debug info utml. lietaam. Kods sanaak daudz leenaaks un lielaaks, bet ir debugojams. Release modee vinjsh to visu vaac sasodīts aaraa un taisa kodu daudz aatraaku, mazaaku un vispaar! Protams, optimaizoshanu var atsleegt saglabaajot paareejaas Release modes iipashiibas, bet vai tam jeega, ja 99% gadiijumu tas patiesi nostraadaa? Sho gadiijumu es arii kaut kaa paarraxtiiju biki savaadaak un viss aizgaaja!
Ar katru kompilēšanas reizi, ja izmanto MS VC 2003 .NET kods palielinās apmēram 10x izmēros. Man 35MB kods izauga par 400MB :lol: . Un ar nākamo reizi vēl lielāks...un tas ir netikai ar debug.
Link to comment
Share on other sites

Liels paldies :D , mēģināšu izburties cauri :wink:

Edited: bubu, tas par to kvadrātu formulu man :?:

Ja jā, kurā vietā tas būtu jāpielieto?

Edited2:Apskatījos to "Vispārējo pirmskaitļu sietu", laikam es ar savām zināšanām (vismaz pagaidām) neuzrakstīšu īpaši efektīvāku algoritmu :cry: Nekas, buršos cauri tutoriāļiem, parēķināšu vieglākus uzdevumus, 4 gadus Datorzinātnes pamācīšos, tad, gan jau, ka pratīšu vairāk :twisted: :twisted: :twisted:

Link to comment
Share on other sites

Turpinot par manu programmu.

Vilx- rakstiitaa protams bija smukaaka un noteikti pareizaaka, bet taa neatrisinaaja vienu probleemu - a veertiiba otraa aplja saakumaa palika 256 Ls. Kaa lai to dabuu gatavu?

Link to comment
Share on other sites

Tfu! Patiesi - to nebiju pamaniijis! Nomaini rindinju:

cout<<"Jusu konta paliek "<<a-i<<"Ls"<<endl;

uz

cout<<"Jusu konta paliek "<<a-=i<<"Ls"<<endl;

 

Par tiem pirmskaitljiem - varbuut meegjini dariit taa - uztaisi papildmasiivu ar visiem liidz shim atrastajiem pirmskaitljiem. Katru naakamo skaitli paarbaudi tikai, vai vinjsh dalaas ar kaadu no liidz shim atrastajiem pirmskaitljiem (nevis visiem skaitljiem) liidz savai kvadraatsaknei. Ja nedalaas - taatad pats ir pirmskaitlis, pieliekam masiivam galaa. Beigaas apskatamies, cik pirmskaitlju esam atradushi, un paari palikushie skaitlji tad ir ne-pirmskaitlji. :)

 

Vajadzeetu buut diezgan fixi. Jautaajums tikai - cik lielu masiivu njemt pirmskaitljiem? Bija kaukaada teoreema par to, bet to es nezinu. :oops: Cik lieli var buut ievaddati? Ja int robezjaas (4 miljardi), mosh uzliec uz nakti saskaitiities? :D

Link to comment
Share on other sites

Maksimālais pirmskaitļu skaits dotā intervāla robežās ir 78498, masīvs sanāk tā neko...

Ja nekļūdos, kaut kur tiku lasījis, ka ir kaut kāds ierobežojums masīva lielumiem, bet nu mēģināšu :wink: , galu galā man tikai 2 testi laika dēļ izgāzās...

 

Edited:Gribēju ķerties klāt, aplauzos, ja man iedod intervālu no 900 000-1 000 000, man jebkurā gadījumā ir jāaprēķina visi pirmskaitļi līdz tam, laikam jāatmet ar roku, apnika man tas uzdevums, turklāt algoritmu pareizu izdomāju un 8 punktus ar savācu :p

Paldies visiem par palīdzību :wink:

Link to comment
Share on other sites

Guest bubu

Ierobežojums ir tikai no vides kur tā izpildās. DOS=64kb, Win/Linux=2gb

Link to comment
Share on other sites

Nu, kas par vainu masiiva lielumam? :? int tipa masiivs ar 80'000 elementiem aiznjemtu ~320KB RAM. Pupu mizas! Ja vien netaisi DOS. ;)

 

Aatrdarbiiba - nu, domaaju, ka butu pienjemama. Viss, ko atliek dariit ir skaitiit pirmskaitljus liidz lielaakajam skaitlim (intervaala augsheejai robezjai) un pa celjam atcereeties, kaads shis skaits bija pie mazaakaa skaitlja (intervaala apaksheejaas robezjas). Tad beigaas atnjem un voila! :)

Link to comment
Share on other sites

cout<<"Jusu konta paliek "<<a-=i<<"Ls"<<endl;

 

nestraada. shii rindinja izsauc erroru, ko pats nemaaku labot. (error C2297: '<<' : illegal, right operand has type 'char [3]')

 

Labi kas tur biaj ar to debuggeri - kaa iisti ar vinju jaariikojas? Kad es uzspiezhu start debug vinsh izmet to pashu erroru ko kompileejot.

Link to comment
Share on other sites

Debugeris ir taada lieta, kas ljauj Tev izpildiit programmu rindinju pa rindinjai; apskatiities mainiigo saturus darbiibas laikaa; izpildiit programmu liidz kaadai konkreetai rindinjai vai staavoklim; utml. Tas ir nenoveerteejams riiks, kas aarkaartiigi paliidz kljuudu mekleeshanaa. Diemzjeel, ne visaas videes tas straadaa paaraak labi. :( Piemeeram, Dev-C++ ir pilniigs murgs ar to - reizeem iet, reizeem ne... Labi debugeri ir Borland un MS produktiem. Bet - debugeris attiecas uz straadaajoshu programmu, un, lai programma straadaatu, tai ir jaanokompileejas... ;)

 

Pameegjini to a-=i ielikt iekavaas.

Link to comment
Share on other sites

Vilx- ko es bez tevis dariitu. Lielais paldies. pagaidaam

Link to comment
Share on other sites

Klausot Vilx padomam uzcepu programmu, kas izmanto masīvu.

Secinājumi:

:arrow: Algoritmu esmu uzrakstījis pareizu, jo atbildes sakrīt ar pirmo variantu 8)

:arrow: Programma mistiskā kārtā nav ātrāka, jo pie intervāla [2;200 000] darbojas 6 sekundes :lol: , kas ir nepiedodami liels laiks...

:arrow: Man laikam ir maz pacietības, jo es nevarēju sagaidīt, kamēr programma apstrādās intervālu [2;1 000 000] un rupji pārtraucu programmas darbību :p

:arrow: Tā, kā ir jāaprēķina arī visi pirmskaitļi līdz intervāla sākumam, tad es atkal rupji pārtraucu programmas darbību, kad tai bija jāpārbauda tikai 6 skaitļi intervālā [999 990;999 995] :lol:

:arrow: Lieliski saprotot, ka algoritms nav efektīvs (ne 1., ne 2. variants) un milzīgā slinkuma/zināšanu trūkuma dēļ negribot pētīt efektīvākus algoritmus, secinu, ka šis uzdevums jāatliek maliņā, kamēr nebūšu augstskolā laiciņu pamācījies...

:arrow: Pats svarīgākais secinājums (vismaz man), bez papīra un pildspalvas ir grūti kaut ko uzprogrammēt :wink:

 

Ja kādu interesē, tad kods:

#include <iostream.h>



int main()

{

//define mainigos

int sakuma_skaitlis,beigu_skaitlis,pskaitlis,pirmskaitli=0;

int masivs[80000],skaits_lidz_sakumam;

masivs[0]=2;



//ielasa mainigos

cin>>sakuma_skaitlis;

cin>>beigu_skaitlis;



//noskaidro pirmskaitlu skaitu lidz intervala sakumam

for(int i=2;i<sakuma_skaitlis;i++)

{

 pskaitlis=i;

 

 //skaitli salidzina ar visiem ieprieksejiem pirmskaitliem

 	//atkarto, kamer masiva ir elementi

 for(int j=0;j<pirmskaitli;j++)

 {

 	if(i%masivs[j]==0)

 	{

   pskaitlis=0;

   break;

 	}

 }

 

 //parbauda vai skaitlis ir pirmskaitlis...

 if(pskaitlis!=0)

 {

 	//saglaba pirmskaitli masiva

 	masivs[pirmskaitli]=pskaitlis; 

 	pirmskaitli++;

 }

}



//saglaba esoso pirmskaitlu skaitu

skaits_lidz_sakumam=pirmskaitli;



//turpina noskaidrot pirmskaitlu skaitu lidz intervala beigam

for(int i=sakuma_skaitlis;i<=beigu_skaitlis;i++)

{

 pskaitlis=i;

 

 //skaitli salidzina ar visiem ieprieksejiem pirmskaitliem

 	//atkarto, kamer masiva ir elementi

 for(int j=0;j<pirmskaitli;j++)

 {

 	if(i%masivs[j]==0)

 	{

   pskaitlis=0;

   break;

 	}

 }

 

 //parbauda vai skaitlis ir pirmskaitlis...

 if(pskaitlis!=0)

 {

 	//saglaba pirmskaitli masiva

 	masivs[pirmskaitli]=pskaitlis; 

 	pirmskaitli++;

 }

}



//izvada atbildi

cout<<pirmskaitli-skaits_lidz_sakumam;



return 0;

}

Link to comment
Share on other sites

Vispaar, tur patiesi kaukas nav riktiigi, ja taa straadaa tik ilgi! :!: Pameegjinaashu pats nokompileet... Hmm... jaa, Tev taisniiba! OK, ieveerteeshu, kur tas joks ir! :?

Link to comment
Share on other sites

Heh, atklaaju! :D Tev jau vajag paarbaudiit nevis ar visiem pirmskaitljiem liidz dotajam skaitlim, bet gan ar visiem pirmskaitljiem liidz dotaa skaitlja kvadraatsaknei! :D Pieliec to, un tad gan lidos! ;) Tikai pie 1020389 tas masiivs kljuust par mazu. :(

Link to comment
Share on other sites

OK, tūlīt mēģināšu :wink: Starp citu uzdevumā ir intervāls [2;1 000 000], tāpēc, jau arī masivs[80000], nevis vairāk.

Man tādas aizdomas, ka tu uzdevumu manā postā iepriekšējā lapā neesi izlasījis :idea: :p

Link to comment
Share on other sites

Murgs...

Sākšu ar to, ka labu laiku padomāju, kā, lai dabū pirmskaitļus līdz dotajam skaitlim :oops: , kamēr atjēdzos, ka man vajag tikai vietu masīvā, līdz kurai ir pirmskaitļi...

 

Labu laiku domāju, kā to dabūt gatavu, līdz, paralēli drukāšanai uz papīra un monitora, dzima teorēma, kuras rezultātā kodā uzradās mainīgais kvadratsakne un kods 2 vietās no

for(int j=0;j<pirmskaitli;j++)

pārtapa par

kvadratsakne=(int)sqrt(pirmskaitli);

for(int j=0;j<kvadratsakne;j++)

 

Programma tagad neapšaubāmi izpildījās ātrāk :D

Bet, ne tik ātri, kā 1. variants :!: Kapēc nezinu, gan jau, ka līko roku dēļ :oops:

Štrunts par visu nolēmu programmu nosūtīt pārbaudei

rezultāts:

 

Tests/Rezultāts

1 Pareizs

2 Pareizs

3 Pareizs

4 Nepareizs

5 Pareizs

6 Pareizs

7 Pareizs

8 Laiks

9 Laiks

10 Laiks

 

Labi, laiku es saprastu, bet kapēc 4. tests ir nepareizs?

Nolēmu pārbaudīt pats, intervāls [2;10] atbilde 4, viss kārtībā, intervāls[2;50] un 15 vietā es dabūju 16, un arī pie [2;1 000 000] dabūju rezultātā par 1 vairāk.

Viss skaidrs, nodomāju, teorēma līka, vajadzētu drošības pēc izdarīt

kvadratsakne++;

uzreiz pēc kvadrātsaknes izvilkšanas, tā teikt, lai pārbauda biku vairāk vērtības, nokompilējās normāli, palaižu - error da error, izbesīja...

 

Nezinu tavu variantu, bet manējais viennozīmīgi ir līks :oops:

 

Secinājums: Jāmēģina atrast zālītes slimībai CurveHands, jeb jāuzlabo blīve starp klaviatūru un krēslu, tāpēc labāk pārlasīšu iesācēju tutoriāļus, un mēģināšu kādu gudrāku grāmatu atrast...

P.S. Nu i palagu sadrukāju :lol:

P.P.S. Pareizi Aleksejs teica

Gljuks ir aprakstījis Erastotena sietu - visvienkāršāko algoritmu pirmskaitlu meklēšanai dotajā intervālā - ipaši neiedziļinājos, taču cik atceros, tad tam bija sarežģītība o(n^2), tā ka nekādus ļoti spīdošos rezultātus ar to neiegūsi. Ja vajag efektīvāku tad izmanto "vispārējo pirmskaitļu sietu", kas ir ātrākais šobrīd publiski zināmais determinētais pirmskaitļu meklēšanas algoritms.
Link to comment
Share on other sites

ar 4. piegaajienu shoriit man izdevaas iekljauties laikaa:

[links aizvaakts] :)

izmantoju bubu ieteikto taktiku.

Iespeejams, ka arii nav pats optimaalaakais, toties straadaa...

 

EDIT: izdomaaju, ka pubilceejot kaadu no risinaajumiem zuud jeega no uzdevuma un Gjirtam rodas iemesls manis sishanai :)

Link to comment
Share on other sites

Guest bljaaviens
cout<<"Jusu konta paliek "<<a-=i<<"Ls"<<endl;

nestraada. shii rindinja izsauc erroru, ko pats nemaaku labot. (error C2297: '<<' : illegal, right operand has type 'char [3]')

 

tas varbuut tapeeec, ka vienaa briidii tev int i paarveertaas par char i (tajaa mirklii tev arii uzradaas int b, kuru, iespejams, vajadzeeja defineet kaa char, nevis nabaga i aiztikt)

Link to comment
Share on other sites

Šorīt saņēmu PM:

nu ja tev ir veeleeshanaas es jau tev vareetu to kodu aizsuutiit kas iet. mani vienkaarshi forumaa nelaizh postet veel visur kur gribu.

atbildot, ka man ir vēlēšanās saņēmu otru :D

nu tad shiitaads bija mans variants:  

 

 

#include <fstream.h> 

#include <math.h> 



int main(int argc, char* argv[]) 

{ 

       //nodefineejam mmmmainiigos 

  ifstream input("primes.in"); 

       int s, b, g; 

       int deriigie = 0; 

       //iielasam intervaalu 

  input >> s >> b; 

       input.close(); 

  //izsleedzam paara skaitlus no intervaala 

       register char x; 

       if (s == 2){ s = 3; deriigie++; } 

  if (s%2 == 0){ s++; } 

       for (int sk = s; sk <= b; sk = sk +2) //sk - visulaiku nepaara, jo paara nekad nav pirmsk (izn. 2) 

       { 

               x = 1; 

               g = (int) sqrt(sk) + 1; 

               for(int i = 3; i <= g; i = i +2) //paarbauda ar visiem nepaara sk jo ar paara sk nepaaris nedalaas 

               { 

                       

        if (sk%i == 0) 

                       { 

                               x = 0; 

                               break; 

                       } 

               } 

               if (x) deriigie++; 

       } 

       ofstream output("primes.out"); 

       output << deriigie; 

       output.close(); 

       return 0; 

} 

 

 

 

ceerams ka buus skaidrs kas kaa kaapeec

 

:arrow: Ieteikums: Mozh Destructor piešķirt lietpratēja tiesības :roll:

Link to comment
Share on other sites

Bet shitais jau ir tas pats Tavs pirmais variants, kas gaaja bezdieviigi leeni! OK, ja Tev neiet, pateikshu, kas konkreti jaaizdara! :) Par pamatu njemam to programmu, kuru Tu iepostoji Thu Aug 04, 2005 11:22 pm .

 

1. Saakumaa pieliec veel vienu mainiigo int k;

2. Tur, kur ir rakstiits (divaas vietaas)

for(int j=0;j<pirmskaitli;j++)

aizstaajam ar

k=(int)sqrt(pskaitlis);

for(int j=0;(j<pirmskaitli) && (masivs[j]<=k);j++)

3. Saakumaa pieliekam #include <math.h>

 

Voila! Un VISS IET. Tava kljuuda bija, ka Tu saliidzinaaji j<kvadratsakne, nevis masivs[j]<kvadratsakne. ;)

Link to comment
Share on other sites

:oops: Paldies :)

Teorēma radās, pateicoties Vilx un pētot pirmskaitļu rindu līdz 40...

Ar to grāmatu, varbūt kaut kad vēlāk, jo

a)Traucē dzīvesvieta

b)Septembrī sāku mācīties LU, un

b1)Gribēsies vispirms aprast ar apstākļiem

b2)Jau 1.sem. B daļā ir "Ievads skaitļu teorijā"

 

Apskatīju Destructor iesūtīto variantu, tas tiešām izpildījās laikā...

 

Papētot tuvāk,šo variantu, konstatēju, ka varu ar salīdzinoši nelielām izmaiņām nokopēt algoritmu uz savu 1.variantu, (tagad nokaunos, ka bija slinkums liekās 10-20 min padomāt) :oops: :oops: :oops:

Jebkurā gadījumā paldies visiem, kas palīdzēja :wink:

Link to comment
Share on other sites

Whadda? :? Taa arii neiebraucu... Tava pilnaa paarlase beigaas straadaaja aatraak? Un kas taa par teoreemu? What is going on? :shock:

Link to comment
Share on other sites

Whadda? :? Taa arii neiebraucu... Tava pilnaa paarlase beigaas straadaaja aatraak? Un kas taa par teoreemu? What is going on? :shock:

Palaboju variantu ar masīviem un salīdzināju ar Destructor variantu, uz aci intervālā [2;1 000 000] strādāja aptuveni vienādi (ap sekundi)

 

Teorēma: jebkura skaitļa lielākais dalītājs nepārsniedz šī skaitļa kvadrātsakni.

Kvadrātsakne no 16=4

16 lielākais dalītājs 8

 

Es, protams, varu kļūdīties, bet man liekas, ka

Teorēma: jebkura skaitļa mazākais dalītājs nepārsniedz šī skaitļa kvadrātsakni.

skanētu pareizāk :roll:

Link to comment
Share on other sites

Guest bubu
Teorēma: jebkura skaitļa mazākais dalītājs nepārsniedz šī skaitļa kvadrātsakni.

Gljuks, tad jau vienmēr tas sanāk 1, jo ir gan mazākais, gan dalītājs.

 

Aleksejs: to tavus nesaliktos netriviālos dalītājus sauc par pirmreizinātājiem. :)

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...