Sunteți pe pagina 1din 1

Problema Palindrom (autor Cristian Frncu)

Cerina 1
Punctul 1 al problemei este relativ banal, cernd s spunem cte numere palindrom exist ntr-un ir
de numere. Cu toate acestea trebuie avut grij deoarece algoritmul standard calculeaz rsturnatul
numrului, care poate s depeasc valoarea maxim a unui ntreg, de circa dou miliarde (de
exemplu numrul 1234554327). Pentru a nu depi ntregul putem proceda n mai multe moduri:
1. Putem s extragem cifrele din capetele opuse ale numrului, spre a le compara, iar apoi le
eliminm. Pentru aceasta vom calcula p10, puterea maxim a lui 10 care este mai mic sau egal cu
numrul nostru, x. Apoi avem:
prima_cifra = x / p10;
ultima_cifra = x % 10;
x = x % p10 / 10;
p10 = p10 / 100;
2. Putem s rsturnm numrul doar pn la jumtatea sa. Facem acest lucru la fel ca n algoritmul
clasic, adaugnd cifrele de la coada lui x la coada lui y, cu diferena c ne vom opri atunci cnd
x<=y.
Cerina 2
Cerina 2 se rezolva similar cu punctul 1, numai c de data aceasta vom numra cte diferen e avem
ntre perechile de cifre. Cu algoritmul clasic rsturnm numrul x n y i apoi extragem pe rnd cifre
din coada ambelor numere calculnd cte perechi diferite avem. Dac numrul de perechi diferite
este 0, numrul este palindrom, iar dac este 2 atunci numrul este aproape palindrom. Avem
aceeai problem ns, ca i la punctul 1, anume pe anumite numere vom depi ntregul. Pentru a
nu depi putem iar aplica metodele descrise la punctul 1.
Cerina 3
Punctul 3 al problemei se reduce la a calcula pentru un numr x cel mai mic palindrom strict mai
mare ca x. Putem rezolva direct, incrementnd x si testnd dac este palindrom, avand grij la
depire. Aceast metod este destul de lent i va depi timpul la cteva teste. O metod mai
rapid este urmtoarea:
Vom porni cu numrul x=x+1 i vom calcula cel mai mic palindrom mai mare sau egal cu x. Pentru
aceasta calculm y, simetrizarea lui x, ca fiind copierea primei jumti n cea de-a doua, rasturnat.
De exemplu pentru 123456 vom calcula 123321, iar pentru 4066345 vom calcula 4066604. Dac
palindromul calculat, y, este mai mare sau egal cu x, atunci el este chiar rspunsul. Altfel, dac este
mai mic, va trebui s calculm numrul z cruia i se adun unu la ultima cifr dinainte de jumatatea
a doua a numrului. Daca simetrizm z vom obine rspunsul.
De exemplu, pentru x = 123456 observm c y este 123321, care nu este mai mare dect x. Drept
care vom aduna 1 la 123 i vom obine 124 i echivalentul lui 124456, care simetrizat ne d
z=124421, rspunsul cutat. Similar, pentru 4066802, calculm y=4066604. Deoarece y < x vom
aduna 1 la 4066, obinnd 4067802, care simetrizat ne d numrul z=4067604, rezultatul cerut.

S-ar putea să vă placă și