Rezolvare completă PbInfo #949 Calendar3

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

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 Adresa de email.

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!