Nu sunt sigur daca sursa scrisa de mine urmareste intocmai descrierea de mai
jos (a trecut ceva vreme de cand am scris-o). In orice caz, ideea este aceasta.
Sa luam ca exemplu numarul 19. Sa reprezentam acest numar in baza 3:
19 (10) = 201 (3). Aceasta inseamna ca putem echilibra 19 grame cu doua
greutati de 9 grame si una de un gram. Dar noi nu dispunem decat de o greutate
de 9 grame! Ideea este deci sa nu reprezentam numarul 19 in baza 3 folosind
cifrele 0, 1 si 2, ci 0, 1 si... -1! Cifra -1 arata ca greutatea
corespunzatoare se asaza pe acelasi taler cu greutatea de masurat.
Asadar 19 (10) = 2*9 + 0*3 + 1*1 = 1*27 + (-1)*9 + 0*3 + 1*1, de unde deducem
ca:
19 = (27+1) - 9.
Putem nota acest lucru in baza "3,14" astfel:
19 (10) = 201 (3) = 1 -1 0 1 (3,14).
Algoritmul intr-o prima faza este:
1) Citeste numarul in baza 10
2) Converteste-l in baza 3,14 (prin intermediul bazei 3)
3) Cifrele -1 indica greutati asezate pe acelasi talger cu greutatea de
masurat, iar cifrele 1 indica greutati asezate pe talgerul opus.
Cum facem conversia? In esenta, fiecare cifra 2 (din reprezentarea in baza 3)
trebuie inlocuita cu o cifra de -1, precedata de o cifra 1. Sa analizam un
exemplu mai complex, 25:
25 (10) = 221 (3). Inlocuim ultimul 2 cu -1 si adaugam 1 inaintea lui:
221 (3) = 3 -1 1. Acum inlocuim 3 cu "1 0" intrucat ne aflam in baza 3:
221(3) = 1 0 -1 1 (3,14). De aici deducem ca 25 = (27+1) - 3
Un algoritm usor de implementat este:
- Citeste N
- Transforma N in baza 3
- Parcurge aceasta reprezentare de la dreapta la stanga
- Ori de cate ori intalnesti o cifra de 2 sau 3
- Scade 3 din aceasta cifra
- Adauga 1 la pozitia urmatoare
Frumusetea la implementare este ca putem genera greutatile necesare in ordine
crescatoare si nu avem nevoie sa retinem toate puterile lui 3, ci numai una la
un moment dat. De asemenea, nu avem nevoie sa implementam decat inmultirea si
impartirea cu rest la 3.
Va raman dator cu o problema frumoasa la care sa va ganditi in cele cateva
saptamani care urmeaza.
|
|