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
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Calendar3:
#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;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #949 Calendar3
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #949 Calendar3 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!