# PBinfo #949 – Calendar3 – Rezolvare C++

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

## Enunț

Cerința
Dându-se o dată calendaristică și un număr nr de zile, să se determine care este data aflată la o diferență de nr de zile.

Date de intrare
Programul citește de la tastatură 3 numere naturale Z, L și A, reprezentând ziua, luna si anul curent, iar pe al doilea rând numărul nr de zile.

Date de ieșire
Programul va afișa pe ecran 3 numere naturale ZI, LUNA, AN reprezentând data cerută.

Restricții și precizări

-100.000 ≤ nr ≤ 100000
Datele calendaristice din fișierul de intrare sunt între 1 ianuarie 1900 și 31 decembrie 2100
Nu se vor fi date calendaristice invalide precum 29 februarie 2015 sau 31 noiembrie 1980
Dacă nr este negativ, data cerută se afla înaintea cele curente.

Exemple:
Intrare

6 1 2015
15
Ieșire

21 1 2015
Intrare

6 1 2015
-7
Ieșire

30 12 2014

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
int nr, z, l, a, zile[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool bisect(int x) {
    if (x % 4)
        return 0;
    if (x % 100)
        return 1;
    if (x % 400)
        return 0;
    return 1;
}
int main() {
    cin >> z >> l >> a >> nr;
    if (nr > 0) {
        while (nr && z > 28) {
            z++;
            int limit = zile[l];
            if (l == 2 && bisect(a) && z > 29)
                limit++;
            if (z > limit)
                l++, z = 1;
            if (l > 12)
                a++, l = 1;
            nr--;
        }
        while (1) {
            int next = 365;
            if (l < 3 && bisect(a))
                next++;
            if (l > 2 && bisect(a+1))
                next++;
            if (nr < next)
                break;
            nr -= next;
            a++;
        }
        while (1) {
            int next = zile[l];
            if (l == 2 && bisect(a))
                next++;
            if (nr < next)
                break;
            nr -= next;
            l++;
            if (l > 12)
                a++, l = 1;
        }
        for (; nr; --nr) {
            z++;
            int limit = zile[l];
            if (l == 2 && bisect(a) && z > 29)
                limit++;
            if (z > limit)
                l++, z = 1;
            if (l > 12)
                a++, l = 1;
        }
    }
    else {
        nr = -nr;
        while (nr && z > 28)
            z--, nr--;
        while (1) {
            int next = 365;
            if (l > 3 && bisect(a))
                next++;
            if (l < 2 && bisect(a-1))
                next++;
            if (nr < next)
                break;
            nr -= next;
            a--;
        }
        while (1) {
            int next = zile[(l+10)%12 + 1];
            if (l == 3 && bisect(a))
                next++;
            if (nr < next)
                break;
            nr -= next;
            l--;
            if (!l)
                l = 12, a--;
        }
        for (; nr; --nr) {
            z--;
            int limit = zile[(l+10)%12 + 1];
            if (l == 3 && bisect(a))
                limit++;
            if (!z)
                l--, z = limit;
            if (!l)
                --a, l = 12;
        }
    }
    cout << z << " " << l << " " << a;
}
```

## Resurse

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