C++实现儒略日转换为公历日期的算法
以下是解决该问题的 C++ 代码: ```cpp #include <iostream> #include <vector> // 判断是否为闰年(儒略历) bool isLeapYearJulian(int year) { if (year > 0) { return year % 4 == 0; } else { // 公元前的闰年判断 return (-year - 1) % 4 == 0; } } // 判断是否为闰年(格里高利历) bool isLeapYearGregorian(int year) { return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); } // 获取每个月的天数 int daysInMonth(int year, int month, bool isJulian) { std::vector<int> days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if ((isJulian && isLeapYearJulian(year)) || (!isJulian && isLeapYearGregorian(year))) { days[2] = 29; } return days[month]; } // 计算日期 void calculateDate(long long julianDay) { int year = -4713; long long days = 0; // 公元前和公元 1582 年 10 月 4 日之前使用儒略历 while (true) { int daysInYear = isLeapYearJulian(year) ? 366 : 365; if (days + daysInYear > julianDay) { break; } days += daysInYear; if (year == -1) { year = 1; } else { year++; } } // 处理 1582 年 10 月的特殊情况 if (year >= 1582) { if (year == 1582) { if (days + 277 > julianDay) { // 在 1582 年 10 月 4 日之前 int month = 1; while (true) { int daysInThisMonth = daysInMonth(year, month, true); if (days + daysInThisMonth > julianDay) { break; } days += daysInThisMonth; month++; } int day = julianDay - days + 1; if (year < 0) { std::cout << day << " " << month << " " << -year << " BC" << std::endl; } else { std::cout << day << " " << month << " " << year << std::endl; } return; } else if (days + 287 <= julianDay) { // 在 1582 年 10 月 15 日之后 days += 10; // 跳过 10 月 5 日 - 10 月 14 日 } } } // 公元 1582 年 10 月 15 日之后使用格里高利历 bool isJulian = false; while (true) { int daysInYear = isLeapYearGregorian(year) ? 366 : 365; if (days + daysInYear > julianDay) { break; } days += daysInYear; year++; } int month = 1; while (true) { int daysInThisMonth = daysInMonth(year, month, isJulian); if (days + daysInThisMonth > julianDay) { break; } days += daysInThisMonth; month++; } int day = julianDay - days + 1; if (year < 0) { std::cout << day << " " << month << " " << -year << " BC" << std::endl; } else { std::cout << day << " " << month << " " << year << std::endl; } } int main() { int Q; std::cin >> Q; for (int i = 0; i < Q; i++) { long long r; std::cin >> r; calculateDate(r); } return 0; } ``` ### 代码说明: 1. **闰年判断函数**:`isLeapYearJulian` 用于判断儒略历中的闰年,`isLeapYearGregorian` 用于判断格里高利历中的闰年。 2. **每月天数函数**:`daysInMonth` 根据年份和月份返回该月的天数,同时考虑闰年的情况。 3. **日期计算函数**:`calculateDate` 函数根据输入的儒略日计算对应的公历日期。首先处理公元前和公元 1582 年 10 月 4 日之前的情况,使用儒略历;然后处理 1582 年 10 月的特殊情况;最后处理公元 1582 年 10 月 15 日之后的情况,使用格里高利历。 4. **主函数**:读取输入的询问组数 `Q` 和每个儒略日,调用 `calculateDate` 函数计算并输出对应的公历日期。 ######[AI问答 | 1343点数解答 | 2026-06-09 14:04:38]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)426
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)382
- Excel 日期格式显示####?这些解决办法快收好!( | 327点数解答 | 2023-12-29 09:53:45)297
- Java实现日程管理系统:添加、修改、查询与提醒一应俱全,数据本地txt保存!(GPT | 5818点数解答 | 2024-06-03 20:02:47)358
- 用Python处理商品销售数据:替换类别、合并类目并输出前5行(百度文心 | 486点数解答 | 2024-08-23 09:14:21)333
- 双11前小明巧用数据:计算机械键盘与游戏鼠标最近购买均价!(字节豆包 | 32点数解答 | 2024-10-17 20:43:03)232
- 云南 8 日摄影行程表 HTML 代码优化与逻辑注意点揭秘(字节豆包 | 217点数解答 | 2025-03-09 13:19:03)287
- 新员工7月业绩冲刺计划书:15天填补28000元缺口,附Word转换指南!(DeepSeek | 233点数解答 | 2025-07-16 18:48:05)129
- 新员工业绩达标计划书:完善方案待店长审批,多维度优化冲刺7月目标!(字节豆包 | 500点数解答 | 2025-07-16 18:50:16)119
- 2025版PHP项目资料管理系统需求文档:全方位打造高效协作与安全存储平台 (字节豆包 | 1332点数解答 | 2025-07-18 10:36:24)176
- Python切片操作巧解经典算法:二维数组90°旋转(阿里通义 | 205点数解答 | 2023-10-31 11:05:29)360
- 揭秘iOS开发:常用算法大集合,提升应用性能与体验!(阿里通义 | 246点数解答 | 2023-11-08 00:43:08)310