4. naloga

Potenciranje

Predstavljajmo si zelo preprost, zbirniku podoben programski jezik. Program je sestavljen iz zaporedja ukazov; pred vsakim ukazom je lahko še oznaka (labela), na katero se lahko sklicujemo pri pogojnih skokih. Dovoljeni ukazi so naslednji:

  • ADD x, y - izračuna vsoto x+y in jo shrani v x;
  • SUB x, y - izračuna razliko x-y in jo shrani v x;
  • MUL x, y - izračuna zmnožek x*y in ga shrani v x;
  • DIV x, y - izračuna celi del količnika x/y in ga shrani v x;
  • MOD x, y - izračuna ostanek po deljenju x z y in ga shrani v x;

Opomba: pri gornjih ukazih mora biti x spremenljivka, y pa je lahko spremenljivka ali celoštevilska konstanta.

  • JL x, y, z - pogojni skok: če je x < y, skoči na ukaz z oznako (labelo) z. Pri tem sta x in y lahko spremenljivki in/ali celoštevilski konstanti. Če pogoj x < y ni izpolnjen, se izvajanje nadaljuje z naslednjim ukazom.

Program lahko uporablja poljubno mnogo spremenljivk. Vse spremenljivke so celoštevilske (kot tip int oz. integer, le da lahko za razliko od teh tipov hranijo poljubno velika cela števila) in jih pred uporabo ni treba posebej deklarirati. Ukazi se izvajajo po vrsti, razen če pride do pogojnega skoka (ukaz JL).

V tem programskem jeziku napiši program, ki izračuna vrednost ab in jo shrani v spremenljivko c. Pri tem je b naravno število. Primer: če je pred začetkom izvajanja tvojega zaporedja ukazov v spremenljivki a vrednost 2, v spremenljivki b pa vrednost 3, mora biti na koncu izvajanja tvojega programa v spremenljivki c vrednost 8. Tvoj program naj pri tem izvede čim manj ukazov za velika števila a in b.

Svojo rešitev tudi dobro utemelji in komentiraj, kako in zakaj deluje.

Spomnimo se, da je b-ta potenca števila a definirana takole:

ab = a * a * ... * a  ,

kjer je število pomnoženih a-jev b (b členov) in da za potence med drugim velja

ab+c = ab * ac   .

Namig: najprej razmisli, kako bi učinkovito računal a2, a4, a8, a16 itd., nato pa še o tem, kako bi s tem prišel do rešitve za poljuben b.

Za ilustracijo je tule primer programa, ki rešuje malo drugačen problem: v spremenljivki vsota izračuna vsoto števil od 1 do n (ob predpostavki, da je n večji od 0):

                     Razlaga (ni del programa)
SUB vsota, vsota postavi vsota na 0
lab1: ADD vsota, n prišteje vsoti trenutno vrednost n
SUB n, 1 zmanjša n za 1
JL 0, n, lab1 ponavlja, dokler je n > 0

Pa še en primer: spodnji program računa isto vsoto, vendar namesto zanke uporabi formulo 1 + 2 + ... + n = n * (n + 1)/2.

                          Razlaga (ni del programa)
SUB vsota, vsota postavi vsota na 0
ADD vsota, n vsota je zdaj enaka n
ADD vsota, 1 vsota je zdaj enaka n + 1
MUL vsota, n vsota je zdaj enaka n(n + 1)
DIV vsota, 2 vsota je zdaj enaka n(n + 1)/2