328
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și31 decembrie 2100 - Nu se vor fi date calendaristice invalide precum
29 februarie 2015sau31 noiembrie 1980 - Dacă
nreste 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