#include <stdio.h>
unsigned long AddDays(unsigned long StartDay, unsigned long Days)
{
unsigned long year = StartDay / 10000, month = StartDay / 100 % 100 - 1, day = StartDay % 100 - 1;
while (Days)
{
unsigned daysInMonth[2][12] =
{
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, // 365 days, non-leap
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } // 366 days, leap
};
int leap = !(year % 4) && (year % 100 || !(year % 400));
unsigned daysLeftInMonth = daysInMonth[leap][month] - day;
if (Days >= daysLeftInMonth)
{
day = 0;
Days -= daysLeftInMonth;
if (++month >= 12)
{
month = 0;
year++;
}
}
else
{
day += Days;
Days = 0;
}
}
return year * 10000 + (month + 1) * 100 + day + 1;
}
int main(void)
{
unsigned long testData[][2] =
{
{ 20130228, 0 },
{ 20130228, 1 },
{ 20130228, 30 },
{ 20130228, 31 },
{ 20130228, 32 },
{ 20130228, 365 },
{ 20130228, 366 },
{ 20130228, 367 },
{ 20130228, 365*3 },
{ 20130228, 365*3+1 },
{ 20130228, 365*3+2 },
};
unsigned i;
for (i = 0; i < sizeof(testData) / sizeof(testData[0]); i++)
printf("%lu + %lu = %lu\n", testData
[i
][0], testData
[i
][1], AddDays
(testData
[i
][0], testData
[i
][1]));
return 0;
}
ICAgICNpbmNsdWRlIDxzdGRpby5oPgogICAgCiAgICB1bnNpZ25lZCBsb25nIEFkZERheXModW5zaWduZWQgbG9uZyBTdGFydERheSwgdW5zaWduZWQgbG9uZyBEYXlzKQogICAgewogICAgICB1bnNpZ25lZCBsb25nIHllYXIgPSBTdGFydERheSAvIDEwMDAwLCBtb250aCA9IFN0YXJ0RGF5IC8gMTAwICUgMTAwIC0gMSwgZGF5ID0gU3RhcnREYXkgJSAxMDAgLSAxOwogICAgCiAgICAgIHdoaWxlIChEYXlzKQogICAgICB7CiAgICAgICAgdW5zaWduZWQgZGF5c0luTW9udGhbMl1bMTJdID0KICAgICAgICB7CiAgICAgICAgICB7IDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEgfSwgLy8gMzY1IGRheXMsIG5vbi1sZWFwCiAgICAgICAgICB7IDMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEgfSAgLy8gMzY2IGRheXMsIGxlYXAKICAgICAgICB9OwogICAgCiAgICAgICAgaW50IGxlYXAgPSAhKHllYXIgJSA0KSAmJiAoeWVhciAlIDEwMCB8fCAhKHllYXIgJSA0MDApKTsKICAgIAogICAgICAgIHVuc2lnbmVkIGRheXNMZWZ0SW5Nb250aCA9IGRheXNJbk1vbnRoW2xlYXBdW21vbnRoXSAtIGRheTsKICAgIAogICAgICAgIGlmIChEYXlzID49IGRheXNMZWZ0SW5Nb250aCkKICAgICAgICB7CiAgICAgICAgICBkYXkgPSAwOwogICAgICAgICAgRGF5cyAtPSBkYXlzTGVmdEluTW9udGg7CiAgICAgICAgICBpZiAoKyttb250aCA+PSAxMikKICAgICAgICAgIHsKICAgICAgICAgICAgbW9udGggPSAwOwogICAgICAgICAgICB5ZWFyKys7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBkYXkgKz0gRGF5czsKICAgICAgICAgIERheXMgPSAwOwogICAgICAgIH0KICAgICAgfQogICAgCiAgICAgIHJldHVybiB5ZWFyICogMTAwMDAgKyAobW9udGggKyAxKSAqIDEwMCArIGRheSArIDE7CiAgICB9CiAgICAKICAgIGludCBtYWluKHZvaWQpCiAgICB7CiAgICAgIHVuc2lnbmVkIGxvbmcgdGVzdERhdGFbXVsyXSA9CiAgICAgIHsKICAgICAgICB7IDIwMTMwMjI4LCAwIH0sCiAgICAgICAgeyAyMDEzMDIyOCwgMSB9LAogICAgICAgIHsgMjAxMzAyMjgsIDMwIH0sCiAgICAgICAgeyAyMDEzMDIyOCwgMzEgfSwKICAgICAgICB7IDIwMTMwMjI4LCAzMiB9LAogICAgICAgIHsgMjAxMzAyMjgsIDM2NSB9LAogICAgICAgIHsgMjAxMzAyMjgsIDM2NiB9LAogICAgICAgIHsgMjAxMzAyMjgsIDM2NyB9LAogICAgICAgIHsgMjAxMzAyMjgsIDM2NSozIH0sCiAgICAgICAgeyAyMDEzMDIyOCwgMzY1KjMrMSB9LAogICAgICAgIHsgMjAxMzAyMjgsIDM2NSozKzIgfSwKICAgICAgfTsKICAgIAogICAgICB1bnNpZ25lZCBpOwogICAgCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodGVzdERhdGEpIC8gc2l6ZW9mKHRlc3REYXRhWzBdKTsgaSsrKQogICAgICAgIHByaW50ZigiJWx1ICsgJWx1ID0gJWx1XG4iLCB0ZXN0RGF0YVtpXVswXSwgdGVzdERhdGFbaV1bMV0sIEFkZERheXModGVzdERhdGFbaV1bMF0sIHRlc3REYXRhW2ldWzFdKSk7CiAgICAKICAgICAgcmV0dXJuIDA7CiAgICB9Cgo=