Pentru realizarea algoritmului am utilizat următoarele variabile:
- x, vectori de 10 întregi, pentru fiecare cifră de la 0 la 9, pentru care am alocat 10*4=40 de octeți (în dreptul fiecărei poziții din vector am păstrat numărul de valori citite din fișier care au cifra de control egală cu indicele din șir);
- cc, de tip short, pentru care am alocat 2 octeți (cu ea am determinat cifra de control a fiecărei valori citite din fișier);
- a, de tip întreg, pentru care am alocat 4 octeți (cu ea am parcurs elementele vectorului x și am citit valorile din fișierul dat până la întâlnirea lui 0).
În concluzie, variabilele folosite utilizează o memorie de 40+2+4=46 de octeți, de unde rezultă EFICIENȚA UTILIZĂRII MEMORIEI (pe lângă variabila utilizată pentru fișier).

În prima parte a algoritmului am declarat variabilele global. Pentru fiecare număr am citit din fișier, diferit de 0, am calculat cifra de control prin intermediul celor două variabile cc și a astfel:
a) pentru fiecare a citit, am inițializat cc (cifra de control) cu 0;
b) am preluat ultima cifră din a repetitiv și am pus-o în cc, care are rolul de a calcula suma cifrelor, în timp ce din a renunțăm la ultima cifră;
c) am atribuit variabilei a valoarea din cc, cu scopul de a recalcula cc (cifra de control) pentru noul a, în cazul în care a nu era cifră (un număr între 0 și 9);
d) am repetat pașii a)-c) până când în a rămânea doar o cifră, respectiv cifra de control;
e) pentru fiecare cifră de control am incrementat valoarea din vector pentru care indicele este egal cu cc (cifra de control).
La întâlnirea valorii 0 în fișier se oprește citirea din fișier, chiar dacă, prin absurd, ar mai fi și alte valori în fișier.
La finalul acestui demers, în vector, în dreptul fiecărui indice, avem numărul valorilor din fișierul citit pentru care cifra de control este egală, iar ele se află pe poziții diferite în șirul din fișier.
Dacă spre exemplu, pe poziția 5 din vectorul x regăsim la final valoarea 3, atunci avem 3 valori în șirul inițial care au aceeași cifră de control, ceea ce înseamnă valoarea-1, valoarea-2 si valoarea-3. Perechile care se pot forma în acest caz sunt: (valoarea-1,valoarea-2), (valoarea-1,valoarea-3) și (valoarea-2,valoarea-3), adică 3x2/2. Prin inducție matematică se poate dovedi că pentru poziția i și valoarea x[i] din vector avem un total de x[i]*(x[i]-1)/2 perechi. Nu e nevoie să mai facem și verificarea dacă valorile sunt 0 sau 1, întrucât numărul perechilor vor fi 0 în aceste cazuri, având în vedere modul de calcul; în cel mai nefericit caz ar trebui să facem și verificare și însumare, în varianta propusă avem doar însumarea care oricum e 0 în aceste cazuri. Toate aceste perechi le-am însumat în variabila cc, pe care am inițializat-o cu 0. Astfel valoarea finală de afișat este de fapt x[0]*(x[0]-1)/2+x[1]*(x[1]-1)/2+...+x[9]*(x[9]-1)/2, ceea ce CLAR ne duce la o EFICIENTIZARE A TIMPULUI DE EXECUȚIE, algoritmul fiind unul liniar, complexitatea algoritmului fiind maxim 10+2*2*N+N+10+1 (unde N este numărul de valori diferite de 0 din fișier, până la întâlnirea lui 0), adică 5*N+21 = O(N), de unde rezultă liniaritatea algoritmului.


