У меня есть эти две функции, и я не могу получить правильный результат для преобразования из юлианского в григорианский календарь. Проблема в том, что если год делится на 4000, это дает мне неверный результат, поскольку это должен быть високосный год, но в соответствии с требованиями это не так. Поэтому я попытался добавить условие, но оно не работает на 100%. Спасибо.
int gregorian_to_julian(int year, int month, int day)const {
int result=0;
int cnt=0;//**added by me
if(year>=4000)//**added by me
cnt=year/4000;//**added by me
int a = (14 - month) / 12;
int m = month + 12 * a -3;
int y = year + 4800 -a;
result = day + ((153 * m + 2) /5) + (365 * y) + (y/4) - (y/100) + (y/400) - 32045;
result-=cnt;
return result;
}
int julian_to_gregorian(int sequence, int &year, int &month, int &day)const {
int result = 1;
int cnt=0;
int a = sequence + 32044;
int b = (4 * a +3) / 146097;
int c = a - (146097 * b) / 4;
int d = (4 * c +3) / 1461;
int e = c - (1461 * d) /4;
int m = (5*e +2) / 153;
day = e - ((153 *m +2) /5) +1;
month = m + 3 -12 * (m/10);
year = 100 *b + d - 4800 + (m/10);
if(year>=4000)//**added by me
cnt=year/4000;//**added by me
day+=cnt;//**added by me
return result;
}
Правило таково:
_leap=false;
if (year% 4==0) _leap=true;
if (year%100==0) _leap=false;
if (year%400==0) _leap=true;
// here _leap holds true if it is a leap year
Других решений пока нет …