eMatematikas Prisijunk Forumas VBE užduotys ONLINE testai

For ciklo uždavinys. Šachmatų išradėjas iš valdovo paprašė atlygio...


Užduotis: Šachmatų išradėjas iš valdovo paprašė tokio atlygio: ant pirmo šachmatų lentos langelio padėti vieną grūdą, ant antrojo – du, ant trečiojo – keturis ir t.t., vis dvigubinant, kol pasibaigs langeliai. Valdovas tik nusijuokė ir paliepė atseikėti grūdų. Kiek grūdų gaus šachmatų išradėjas. Šachmatų lentoje yra 64 langeliai. Parašykite programą šiam uždaviniui spręsti. Rezultato reikšmei atmintyje laikyti panaudokite double duomenų tipą.
Pasitikrinkite: Ekrane turi būti spausdinama: Šachmatų išradėjas gaus 18446744073709551616 grūdų.

Taigi, niekaip nesugalvoju kaip išspręsti šį uždavinį...

#include <iostream>

using namespace std;

int main()
{
double ats;

for(int i = 1; i <= 64; i++)
    {
        // nesugalvoju kokį sakinį čia rašyti
    }

    cout << ats << endl;

return 0;
}

Bučiau dėkingas, jei kas paaiškintų.

Susikurk dar vieną kintamąjį, kuris saugos grūdų, dedamų ant tam tikro langelio, skaičių. Pradinė reikšmė jo bus 1, o vėliau cikle kaskart ji bus dvigubinama. Tuo tarpu tam pačiam cikle keisi ir viso padėtų grūdų skaičių (kintamasis ats), t.y. prie jau esamos reikšmės pridėsi ant naujo langelio padėtų grūdų skaičių.

#include <iostream>

using namespace std;

int main()
{
double ats = 0;
double g = 1; // jei pakeičiu į int tipą, ats gaunu -2

for(int i = 2; i <= 64; i++)
    {
        g *= 2;
        ats += g;
    }

    cout << ats << endl;

return 0;
}
Atsakymą gaunų tokį: 1.84467e+019. Atsakymas gaunasi panašus, bet kodėl nerašo 18446744073709551616 ?

P.S Dėkui už išsamų paaiškinimą.

Na vat ir man taip atsakymą išmetė, reikia gal internete paieškoti informacijos, kaip pakeisti atsakymo išvedimą. Tik pagal tavo kodą pirminė kintamojo ats turėtų būti 1, nes dabar gaunasi, jog skaičiuoji tik nuo antro langelio, ant kurio dedi du grūdus.

Paieškojau internete ir radau.#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
double ats = 0;
double g = 1;

for(int i = 2; i <= 64; i++)
    {
        g *= 2;
        ats += g;
    }

    cout << setprecision(20) << ats + 1 << endl;
/* setprecision(20) - 20 todėl, nes atsakymas susidaro iš 20 skaitmenų. */

return 0;
}
Ačiū, dar kartą.

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »