def adunare(): """ Adunarea a doua numere naturale intr-o baza citita de la tastatura(2-16). Numerele pot sa fie in aceeasi baza sau nu. """ print("\nPrimul numar: ".upper()) numar1 = Console.citesteInstanta() numar1 = Operatii(numar1[0], numar1[1]) print("\nAl doilea numar: ".upper()) numar2 = Console.citesteInstanta() numar2 = Operatii(numar2[0], numar2[1]) print("\nBaza destinatie: ".upper()) baza = Console.citesteBaza( "Citeste o baza destinatie de la 2 la 16 in care vrei sa se afle rezultatul: " ) nr1 = Console.fromList_toString(numar1.getNumar()) nr2 = Console.fromList_toString(numar2.getNumar()) baza1 = numar1.getBaza() baza2 = numar2.getBaza() numar1 = Console.converteste(numar1, baza) numar2 = Console.converteste(numar2, baza) return "\nREZULTAT: {}({}) + {}({}) = {}({})".format( nr1, baza1, nr2, baza2, Console.fromList_toString(Operatii.adunare(numar1, numar2)), baza)
def substitutie(nr, baza): """ Algoritmul de conversie a unui numar dintr-o baza mai mica intr-o baza mai mare folosind metoda substitutiei. :INPUTS: - nr- o instanta a clasei Operatii din modulul operatiiElementare. - baza- baza in care vrem sa convertim numarul :OUTPUTS: rezultat- rezultatul convertirii numarului in baza ceruta. Daca nr=244(7), acesta va fi o instanta a clasei Operatii, deci se va afla sub forma Operatii([2,4,4],7) Unde: [2,4,4]- sirul cifrelor numarului 7 - baza in care se afla numarul Pentru numarul 332(6) -> ? (7) ,avem lista cifrelor [3,3,2] Se parcurge lista cifrelor de la stanga spre dreapta [3, 3 ,2] ordine puteri: 2 1 0 Se imnulteste fiecare cifra cu baza in care se afla numarul curent ridicata la o putere ( vezi ordinea puterilor). Trebuie sa fim atenti la faptul ca calculele se vor efectua in baza destinatie rezultat= 3*6^2 + 3*6 + 2 6^2 in baza 7 va fi egal cu 51 (ne folosim de algoritmul de inmultire a unui numar cu o cifra) rezultat= 3*51 + 3*6 + 2 3*51 in baza 7 va fi egal cu 213 3*6 in baza 7 va fi egal cu 24 rezultat= 213 + 24 +2 (ne folosim de algoritmul de adunare a doua numere in aceeasi baza de numeratie) rezultat = 213+ 26= 242 (7) """ rezultat = Operatii([0], baza) listaCifre = nr.getNumar() for index in range(len(listaCifre)): x = Operatii([nr.getBaza()], baza) #baza= baza in care vrem sa trecem numarul if index == len(listaCifre) - 1: x = Operatii([1], baza) else: for putere in range(len(nr.getNumar()) - index - 2, 0, -1): x = Operatii.inmultire(x, nr.getBaza()) x = Operatii(x, baza) x = Operatii.inmultire(x, listaCifre[index]) x = Operatii(x, baza) rezultat = Operatii.adunare(x, rezultat) rezultat = Operatii(rezultat, baza) x = rezultat.getNumar() return rezultat.getNumar()
def test_adunare(): numar1 = Operatii([3, 1, 4, 7], 8) numar2 = Operatii([2, 0, 2], 8) assert numar1.adunare(numar2) == [3, 3, 5, 1]