Pereiti prie turinio

Rekomenduojami pranešimai

Sveiki, ar galima kaip nors sutrumpinti sita if'a? Programa veikia bet per ilgai, reikia sutrumpinti darbo laika, manau tai del sito if'o, bet nezinau kaip dar ji galima uzrasyti.

for(i=1;i<=a;i++)

if(i%2==0 && i%3==0 && i%4==0 && i%5==0 && i%6==0 && i%7==0 && i%8==0 && i%9==0 && i%10==0)

Redagavo satrebor2008
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki, ar galima kaip nors sutrumpinti sita if'a? Programa veikia bet per ilgai, reikia sutrumpinti darbo laika, manau tai del sito if'o, bet nezinau kaip dar ji galima uzrasyti.

for(i=1;i<=a;i++)

if(i%2==0 && i%3==0 && i%4==0 && i%5==0 && i%6==0 && i%7==0 && i%8==0 && i%9==0 && i%10==0)

 

Ciklai, o ne if'ai, priverčia programą veikti lėtai. Turbūt pas tave a labai didelis.

 

-----------------

 

bool divisible = true;
for (int j = 2; j < 11 && divisible; j++) {
 divisible = (i % j == 0);
}

 

Arba paprasčiau:

bool divisible = (i % 2520 == 0);

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Let me guess: sukasi ciklas nuo 1 iki n ir tikrina šitą salygą? If'as gali būt bet kokio ilgio - sulėtėjimas bus nejaučiamas, tavo ciklas yra sulėtėjimo priežastis.

 

Jeigu nori programą pagreitint 10 kartų, inkrementuok ciklo kintamąjį po 10 vienetų ir skaičiuok nuo 10 iki n. Joks skaičius in between netenkins sąlygos, nes nesidalins iš 10. Manau tas ir išspręs problemą.

 

EDIT: ah, pasirodo net guessint nereikėjo. :D

Redagavo Karolis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Man reikia rasti kiek skaiciu intervale nuo 1 iki n, dalinasi is 2,3,4,5,6,7,8,9,10. Todel ta if,a ir idejau, ten dar turi but. Sum=sum+1 po if'u

 

Va, pagreitinau n kartų.

 

sum = n / 2520;

-------------------------

 

Geras pavyzdys, kuo skiriasi, kai darai kaip parašyta sąlygoje ir kai prieš tai kažkiek pamąstai, kaip geriau padaryti.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Let me guess: sukasi ciklas nuo 1 iki n ir tikrina šitą salygą? If'as gali būt bet kokio ilgio - sulėtėjimas bus nejaučiamas, tavo ciklas yra sulėtėjimo priežastis.

 

Jeigu nori programą pagreitint 10 kartų, inkrementuok ciklo kintamąjį po 10 vienetų ir skaičiuok nuo 10 iki n. Joks skaičius in between netenkins sąlygos, nes nesidalins iš 10. Manau tas ir išspręs problemą.

 

EDIT: ah, pasirodo net guessint nereikėjo. :D

Tai tipo vietoi i++ reikia daryt i+=10 ir tikrint ar atitinka salyga?

 

Ps: sorry uz tokius klausimus, tik pradejau programuot :)

Redagavo satrebor2008
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai tipo daryt i+=10 ir tikrint ar atitinka salyga?

 

Ps: sorry uz tokius klausimus, tik pradejau programuot :)

 

Tavo problema lėtai veikia dėl to, nes bereikalingai tikrinus kai kuriuos skaičius. Pavyzdžiui, tikrai žinai, kad nereikia tikrinti nelyginių skaičių, nes tokie skaičiai nesidalina iš dviejų. Todėl galėtum programą pagreitinti dvigubai su i+=2, nes lyginių skaičių yra tik kas antras. Atitinkamai ir su kitais. Žinoma, jeigu vietoj i+=2 paimsi i+=10 (nes reikia, kad ir dalintųsi iš dešimt), tai programą pagreitinsi dešimt kartų.

 

Bet galima padaryti protingiau. Jei reikėtų ieškoti skaičių, kurie dalintųsi tik iš 2 ir iš 3, tai vietoj to galime daryti i+=6, nes būtent tik kas šeštas skaičius dalinsis iš 2 ir 3. Taigi, galim sutrumpinti ciklą paimant daliklių mažiausią bendrą kartotinį MBK(2, 3) = 6.

 

Dabar kai imam visus daliklius pagal sąlygą, tai MBK(2 … 10) = 2520. T. y. galim daryti i+=2520.

 

Galiausiai, kadagi tau reikia tik suskaičiuoti, kiek tokių dalių skaičių yra intervale, o mes jau žinom, kad tik kas 2520 skaičius yra toks, tai galima suskaičiuoti iškart, kaip ir pateikiau aukščiau:

 

count = n / 2520;

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tavo problema lėtai veikia dėl to, nes bereikalingai tikrinus kai kuriuos skaičius. Pavyzdžiui, tikrai žinai, kad nereikia tikrinti nelyginių skaičių, nes tokie skaičiai nesidalina iš dviejų. Todėl galėtum programą pagreitinti dvigubai su i+=2, nes lyginių skaičių yra tik kas antras. Atitinkamai ir su kitais. Žinoma, jeigu vietoj i+=2 paimsi i+=10 (nes reikia, kad ir dalintųsi iš dešimt), tai programą pagreitinsi dešimt kartų.

 

Bet galima padaryti protingiau. Jei reikėtų ieškoti skaičių, kurie dalintųsi tik iš 2 ir iš 3, tai vietoj to galime daryti i+=6, nes būtent tik kas šeštas skaičius dalinsis iš 2 ir 3. Taigi, galim sutrumpinti ciklą paimant daliklių mažiausią bendrą kartotinį MBK(2, 3) = 6.

 

Dabar kai imam visus daliklius pagal sąlygą, tai MBK(2 … 10) = 2520. T. y. galim daryti i+=2520.

 

Galiausiai, kadagi tau reikia tik suskaičiuoti, kiek tokių dalių skaičių yra intervale, o mes jau žinom, kad tik kas 2520 skaičius yra toks, tai galima suskaičiuoti iškart, kaip ir pateikiau aukščiau:

 

count = n / 2520;

Padariau i+=10 tai vistiek timE limit meta. O del 2520, kaip isviso sitas skaicius gaunasi? 😀

 

Aciu

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kaip ir minėjau anksčiau, tai mažiausias bendras kartotinis.

Padariau for(i=0;i<=n;i+=2520) su tuo ifu kur pradzioje rasiau, ir atsakyme raso 2 nors turi buti 1.

 

PS: pataisiau kad rasytu atsakyma gera, bet dabar vistiek time limit raso...

Redagavo satrebor2008
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Padariau for(i=0;i<=n;i+=2520) su tuo ifu kur pradzioje rasiau, ir atsakyme raso 2 nors turi buti 1

Ir nekilo noras pabandyt atsispausdinti, kokius i priskaičiavo?

 

--------------

 

PS: pataisiau kad rasytu atsakyma gera, bet dabar vistiek time limit raso...

Koks pas tave maksimalus n ir koks laiko limitas? Spėju, kad programos gale būsi uždėjęs papildomą skaitymą iš konsolės ar system("PAUSE"), kad langas automatiškai neužsidarytų. Ar klystu?

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ir nekilo noras pabandyt atsispausdinti, kokius i priskaičiavo?

 

--------------

 

 

Koks pas tave maksimalus n ir koks laiko limitas? Spėju, kad programos gale būsi uždėjęs papildomą skaitymą iš konsolės ar system("PAUSE"), kad langas automatiškai neužsidarytų. Ar klystu?

Priskaiciuoja viska normaliai, kai ivedu 3000 isveda 2520, bet kai parasau sum=sum+1 man isveda 2 vietoi vieneto... Man net ivedus 0 atsakyme 1 isveda...

Redagavo satrebor2008
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ir nekilo noras pabandyt atsispausdinti, kokius i priskaičiavo?

 

--------------

 

 

Koks pas tave maksimalus n ir koks laiko limitas? Spėju, kad programos gale būsi uždėjęs papildomą skaitymą iš konsolės ar system("PAUSE"), kad langas automatiškai neužsidarytų. Ar klystu?

As su long long darau, maksimalus n yra 10^18, system("pause") nera ir pagal salyga turi buti nuo 1 iki n todel i+=2520 jau negali but nest tada jau bus 2521, kiek suprantu nuo 1 iki n tai i=1 tai jau i+=2520 netinka

Redagavo satrebor2008
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bet kuris skaičius, kuris dalinsis iš 2,3,4,5,6,7,8,9 ir 10 dalinsis iš 2520. Tavo sprendimas yra savo n padalint iš šito skaičiaus ir sužinosi, kiek tokių skaičių (kurie dalinasi iš 2..10) yra intervale nuo 1 iki n. Nelabai supratau tavo paskutinius samprotavimus.

 

Įmesk pilną kodą.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Bet kuris skaičius, kuris dalinsis iš 2,3,4,5,6,7,8,9 ir 10 dalinsis iš 2520. Tavo sprendimas yra savo n padalint iš šito skaičiaus ir sužinosi, kiek tokių skaičių (kurie dalinasi iš 2..10) yra intervale nuo 1 iki n. Nelabai supratau tavo paskutinius samprotavimus.

 

Įmesk pilną kodą.

for( i = 1; i <= n; i++){

if(i%2520==0){

sum=(sum+1);}

 

Su situo kodu time limit meta

Redagavo satrebor2008
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Ciklai, o ne if'ai, priverčia programą veikti lėtai. Turbūt pas tave a labai didelis.

 

-----------------

 

bool divisible = true;
for (int j = 2; j < 11 && divisible; j++) {
 divisible = (i % j == 0);
}

 

Arba paprasčiau:

bool divisible = (i % 2520 == 0);

 

tai netolygu kas cikle yra, bet labiausiai darbą letina salygos

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

  • Prisijunk prie bendruomenės dabar!

    Uždarbis.lt nariai domisi verslo, IT ir asmeninio tobulėjimo temomis, kartu sprendžia problemas, dalinasi žiniomis ir idėjomis, sutinka būsimus verslo partnerius ir dalyvauja gyvuose susitikimuose.

    Užsiregistruok dabar ir galėsi:

    ✔️ Dalyvauti diskusijose;

    ✔️ Kurti naujas temas;

    ✔️ Rašyti atsakymus;

    ✔️ Vertinti kitų žmonių pranešimus;

    ✔️ Susisiekti su bet kuriuo nariu asmeniškai;

    ✔️ Naudotis tamsia dizaino versija;

    ir dar daugiau.

    Registracija trunka ~30 sek. ir yra visiškai nemokama.

  • Naujausios temos

  • Karštos temos

×
×
  • Pasirinkite naujai kuriamo turinio tipą...