# PBinfo #2415 – nr_pal – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Se dau n întrebări de forma: Câte palindromuri există în intervalul [a, b]?, unde a și b sunt numere naturale date, cu a ≤ b.

Date de intrare
Fișierul de intrare nr_pal.in conține pe prima linie numărul natural nenul n, iar pe următoarele n linii, n perechii de forma a b ce reprezintă capetele intervalelor.

Date de ieșire
Fișierul de ieșire nr_pal.out va conține răspunsurile la cele n întrebări, fiecare pe câte un rând.

Restricții și precizări

0 < n ≤ 100.000
0 ≤ a ≤ b ≤ 1.000.000.000

Exemplu:
nr_pal.in

2
5 23
1 255
nr_pal.out

7
34
Explicație
La prima întrebare în intervalul [5,23] exista 7 palindromuri: 5,6,7,8,9,11,22.

## Cod sursă C++

```cpp
/// Vlad Tir, Colegiul National "Tudor Vladimirescu", Targu-Jiu
#include <cstdio>
/// Functie ce returneaza numarul de cifre ale lui x
int nr_cifre(int x){
    int ct=0;
    if(x==0) return 1;
    while(x>0){
        ++ct;
        x/=10;
    }
    return ct;
}
/// Functie ce returneaza a^b
int pow(int a,int b){
    int P=1;
    for(int i=1;i<=b;++i)
        P*=a;
    return P;
}
/// Functie ce returneaza oglinditul lui x
int rev(int x){
    int ans=0;
    while(x>0){
        ans=ans*10+(x%10);
        x/=10;
    }
    return ans;
}
int nr_pal(int n){
    if(n==-1) return 0;
    int cif=nr_cifre(n),ans=1;
    /// Daca n are numar impar de cifre
    if(cif%2==1){
        ans+=2*(pow(10,cif/2)-1);
        /// Palindromul de cif cifre format din primele cif/2+1 cifre ale lui n
        int pal=n/pow(10,cif/2)*pow(10,cif/2)+rev(n/pow(10,cif/2+1));
        /// Daca n este mai mare decat pal,avem o solutie in plus
        if(n>=pal) ans+=n/pow(10,cif/2)-pow(10,cif/2)+1;
        else ans+=n/pow(10,cif/2)-pow(10,cif/2);
    }
    /// Daca n are numar par de cifre
    else{
        ans+=2*(pow(10,(cif-1)/2)-1)+9*pow(10,(cif-1)/2);
        /// Palindromul de cif cifre format din primele cif/2 cifre ale lui n
        int pal=n/pow(10,cif/2)*pow(10,cif/2)+rev(n/pow(10,cif/2));
        /// Daca n este mai mare decat pal,avem o solutie in plus
        if(n>=pal) ans+=n/pow(10,cif/2)-pow(10,cif/2-1)+1;
        else ans+=n/pow(10,cif/2)-pow(10,cif/2-1);
    }
    return ans;
}
int main(){
    int n;
    freopen("nr_pal.in","r",stdin);
    freopen("nr_pal.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        int a,b;
        scanf("%d %d",&a,&b);
        printf("%d\n",nr_pal(b)-nr_pal(a-1) );
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2415)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2415/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2415/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
