# PBinfo #3720 – Aproape – Rezolvare C++

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

## Enunț

Se dă un număr N în baza 10. Un număr M se numește aproape de N dacă îndeplinește următoarele trei condiții:


Are același număr de cifre cu N.
Reprezentarea în baza 10 diferă față de cea a lui N în exact o poziție. Altfel spus, nu mai mult, nici mai puțin, o singură cifră diferă.
Această cifră este fie cu 1 mai mică, fie cu 1 mai mare decât cifra corespunzătoare din N.

Exemplu: Să presupunem că N = 1903. Un exemplu de număr M care este aproape de N este 1913, pentru că diferă (doar) cifra zecilor, iar diferența între 0 (cifra zecilor în N) și 1 (cifra zecilor în M) este 1. Numerele 1903, 903 și 1893 nu sunt aproape de N.

Cerința
Cunoscând numărul N, să se scrie un program care determină:


Numărul de cifre ale acestui număr.
Numărul de numere aproape de N.
Numărul de numere aproape de cel puțin un număr aproape de N.

Date de intrare
Fișierul de intrare aproape.in conține pe prima linie un număr V a cărui valoare poate fi doar 1, 2 sau 3, iar pe a doua linie numărul natural N.

Date de ieșire
Dacă valoarea lui V este 1, atunci fișierul aproape.out va conține pe prima linie un singur număr ce reprezintă numărul de cifre ale lui N.

Dacă valoarea lui V este 2, atunci fișierul aproape.out va conține pe prima linie un singur număr natural ce reprezintă numărul de numere aproape de N.

Dacă valoarea lui V este 3, atunci fișierul aproape.out va conține pe prima linie un singur număr natural ce reprezintă numărul de numere aproape de un număr aproape de N.

Restricții și precizări

0 ≤ N < 1.000.000.000
Pentru teste în valoare de 20 de puncte avem V = 1.
Pentru teste în valoare de 30 de puncte avem V = 2.
Pentru teste în valoare de 50 de puncte avem V = 3.
Aveți grijă să nu numărați vreun număr de mai multe ori!

Exemplul 1:
aproape.in

1
1903
aproape.out

4
Exemplul 2:
aproape.in

2
1903
aproape.out

5
Explicație
Numerele aproape de 1903 sunt: 1803, 1902, 1904, 1913 și 2903.

Exemplul 3:
aproape.in

3
1903
aproape.out

15
Explicație
Cele 15 numere sunt: 1703, 1802, 1804, 1813, 1901, 1903, 1905, 1912, 1914, 1923, 2803, 2902, 2904, 2913 și 3903.

## Cod sursă C++

```cpp
/* Autor: Tulba-Lecu Theodor-Gabriel
 * Complexitate: O(log(N))
 * Implementare: Formula
 */
#include <bits/stdc++.h>
using namespace std;
int main() {
    bool first = true;
    int N, V, mod1 = 0, mod2 = 0, mod3 = 0;
    FILE *in = fopen("aproape.in", "r");
    FILE *out = fopen("aproape.out", "w");
    fscanf(in, "%d %d", &V, &N);
    do {
        if (N < 10) {
            if (N <= 1 || N == 9) {
                if (N == 1 && first) {
                    mod2++;
                } else {
                    mod1++;
                }
            } else
                mod2++;
            if (N <= 2 || N >= 8) {
                if (N == 2 && first) {
                    mod3 += 2;
                } else {
                    mod3++;
                }
            } else
                mod3 += 2;
        } else {
            if (N % 10 == 0 || N % 10 == 9)
                mod1++;
            else
                mod2++;
            if (N % 10 <= 1 || N % 10 >= 8)
                mod3++;
            else
                mod3 += 2;
        }
        N /= 10;
        first = false;
    } while (N > 0);
    if (V == 1) {
        fprintf(out, "%d\n", mod1 + mod2);
    } else if (V == 2) {
        fprintf(out, "%d\n", mod1 + 2 * mod2);
    } else {
        // {numarul n} + numerele in care schimbam o singrua cifra cu 2 +
        // numarul de numere in care schimbam 2 cifre (perechile ordonate
        // cu o singura optiune + 2 * perechile ordonate prima cu o optiune, a
        // doua cu 2 optiuni + 4 * perechile ordonate de cifre cu 2 optiuni)
        fprintf(out, "%d\n",
                1 + mod3 + mod1 * (mod1 - 1) / 2 + 2 * mod2 * (mod2 - 1) +
                    2 * mod1 * mod2);
    }
    return 0;
}
```

## Resurse

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