Problema de pe pbinfo #1611:

Un număr se numește palindrom dacă prima lui cifră este egală cu ultima, a doua cu penultima și așa mai departe. De exemplu numerele 1221, 505 și 7 sunt palindromuri, în vreme ce 500, 1410 și 2424 nu sunt palindromuri.
Similar, un număr se numește aproape palindrom dacă are aceleași perechi de cifre identice ca un palindrom, mai puțin o pereche în care cifrele diferă. De exemplu numerele 500, 1411, 2444, 1220, 53625, 14 și 4014 sunt numere aproape palindromuri, în vreme ce 1221, 1410, 6, 505, 22 și 512125 nu sunt numere aproape palindromuri deoarece fie sunt palindromuri, fie au prea multe perechi de cifre diferite.
Mai definim palindromul asociat al unui număr x ca fiind cel mai mic număr palindrom p strict mai mare decât x (p>x). De exemplu palindromul asociat al lui 5442 este 5445, palindromul asociat al lui 2445 este 2552, al lui 545 este 555, al lui 39995 este 40004, al lui 500 este 505, iar al lui 512125 este 512215.
Cerințe:
Scrieţi un program care citind un număr natural nenul n și apoi un șir de n numere naturale determină:

1. câte dintre cele n numere sunt palindrom
2. câte dintre cele n numere sunt aproape palindrom
3. palindromurile asociate pentru cele n numere citite.
Date de intrare:
Fișierul de intrare palindrom2.in conține pe prima linie un număr C. Pentru toate testele, C poate lua numai valorile 1, 2 sau 3. Pe a doua linie se află numărul n, iar pe a treia linie cele n numere naturale despărțite prin câte un spațiu.
Date de ieșire:
Fișierul de ieșire palindrom2.out:

dacă C=1, va conține un singur număr natural reprezentând numărul de numere palindrom din șir;
dacă C=2, va conține numărul de numere din șir care sunt aproape palindrom;
dacă C=3, va conține numerele palindrom asociate celor n numere din șir, separate prin câte un spațiu;
Restricții și precizări:
1 ≤ n ≤ 10 000
1 ≤ numerele din șir ≤ 2 000 000 000
Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 30 de puncte, iar pentru rezolvarea corectă a celei de a treia cerințe se acordă 50 de puncte.

Răspuns :

DACA ITI DA 100 PCT, COROANA TE ROG!!!

#include <fstream>

using namespace std;

ifstream fin("palindrom2.in");

ofstream fout("palindrom2.out");

int main() {

int c, n, i, j, k, d = 1, nrap = 0, nrpal = 0;

long long x, y, z = 0, a, b;

fin >> c;

fin >> n;

for(i = 1; i <= n; i++) {

fin >> x;

y = x;

z = k = 0;

while (y) {

z = z * 10 + y % 10;

k++;

y /= 10;

}

if(c == 1) {

if(x == z) nrpal++;

}

else

if(c == 2) {

a = x, b = z, d = 0;

while(a && d <= 2) {

if(a % 10 != b % 10) d++;

a /= 10;

b /= 10;

}

if(d == 2) nrap++;

}

else {

int m = 1, prim, ultim;

for(j = 1; j <= k/2; j++)

m *= 10;

y = x / m * m + z % m;

if(y <= x) {

if(k % 2 == 0) a = b = (x / m + 1);

else a = b = (x / m + 1)/10;

z = 0;

while(b) {

z = z * 10 + b % 10;

b = b / 10;

}

y=(x / m + 1)* m + z;

}

fout << y << " ";

}

}

if(c == 1) fout << nrpal;

else if(c == 2) fout << nrap;

return 0;

}