fbpx

Problema #949 – Calendar3 – Rezolvari PBInfo

de Mihai-Alexandru

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
#include <bits/stdc++.h>
using namespace std;

int zileLuna[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int esteBisect(int an)
{
    return (an % 400) == 0 || ( an % 4 == 0  &&  an % 100 != 0 );
}

void calculeazaData(int &zi, int &luna, int &an, int nr)
{
    int nrzileluna, lunacrt = luna;
    if( nr >= 0)
    {
        nrzileluna = zileLuna[lunacrt];
        if( luna == 2 && esteBisect(an)) nrzileluna++;
        if( zi + nr > nrzileluna )
        {
            nr = nr - nrzileluna + zi;
            zi = nrzileluna;
        }
        while( zi + nr > nrzileluna )
        {
            lunacrt = lunacrt + 1;
            if(lunacrt > 12)
            {
                lunacrt = 1;
                an++;
            }
            nrzileluna = zileLuna[lunacrt];
            if( lunacrt == 2 && esteBisect(an)) nrzileluna++;
            nr = nr - nrzileluna;
            zi = nrzileluna;
            luna = lunacrt;
        }
        zi = zi + nr;
    }
    else
    {

        if( zi + nr < 1 )
        {
            nr += zi - 1;
            zi = 1;
        }
        while( zi + nr < 1 )
        {
            lunacrt = lunacrt - 1;
            if(lunacrt < 1)
            {
                lunacrt = 12;
                an--;
            }
            nrzileluna = zileLuna[lunacrt];
            if( lunacrt == 2 && esteBisect(an)) nrzileluna++;
            nr = nr + nrzileluna;
            zi = 1;
            luna = lunacrt;
        }
        zi = zi + nr;
    }
}

int main()
{
    int zi, luna, an, nr;
    cin >> zi >> luna >> an >> nr;
    calculeazaData(zi, luna, an, nr);
    cout << zi << ' ' << luna << ' ' << an;
    return 0;
}
Comentarii

S-ar putea sa iti placa