256
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 2015
sau31 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