C++ 代码:从儒略日精准计算公历日期及复杂度分析
以下是解决该问题的 C++ 代码: ```cpp #include <iostream> #include <vector> using namespace std; // 判断是否为闰年 bool isLeapYear(int year, bool isGregorian) { if (isGregorian) { return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0); } if (year > 0) { return year % 4 == 0; } else { return (-year - 1) % 4 == 0; } } // 每个月的天数 int monthDays[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 根据儒略日计算公历日期 string calculateDate(long long julianDay) { int year = -4713; // 起始年份 int month = 1; int day = 1; // 公元前 4713 年 1 月 1 日到 1582 年 10 月 4 日 while (julianDay > 0) { int daysInYear = 365; if (isLeapYear(year, false)) { daysInYear = 366; } if (year == 1582) { daysInYear = 355; // 1582 年特殊处理,少 10 天 } if (julianDay >= daysInYear) { julianDay -= daysInYear; year++; } else { break; } } // 处理 1582 年 10 月特殊情况 if (year == 1582) { if (julianDay > 277) { // 10 月 15 日及以后 julianDay += 10; } } // 处理月份和日期 while (julianDay > 0) { int daysInMonth = monthDays[month]; if (month == 2 && isLeapYear(year, year >= 1582)) { daysInMonth = 29; } if (julianDay >= daysInMonth) { julianDay -= daysInMonth; month++; if (month > 12) { month = 1; year++; } } else { day = julianDay; julianDay = 0; } } // 格式化输出 string result; if (year <= 0) { result = to_string(day) + " " + to_string(month) + " " + to_string(-year) + " BC"; } else { result = to_string(day) + " " + to_string(month) + " " + to_string(year); } return result; } int main() { int Q; cin >> Q; vector<long long> r(Q); for (int i = 0; i < Q; i++) { cin >> r[i]; } for (int i = 0; i < Q; i++) { cout << calculateDate(r[i]) << endl; } return 0; } ``` 代码说明: 1. `isLeapYear` 函数:用于判断给定年份是否为闰年。根据是否采用格里高利历,有不同的判断规则。 2. `monthDays` 数组:存储每个月的天数。 3. `calculateDate` 函数:根据输入的儒略日计算对应的公历日期。 - 首先处理公元前 4713 年 1 月 1 日到 1582 年 10 月 4 日的情况,逐年减去天数,直到剩余天数不足以减去一整年。 - 对于 1582 年 10 月的特殊情况,进行额外处理。 - 然后逐月减去天数,直到剩余天数不足以减去一个月,确定月份和日期。 - 最后根据年份是否为公元前,格式化输出结果。 4. `main` 函数:读取输入的询问组数 `Q` 和每个儒略日,调用 `calculateDate` 函数计算并输出对应的公历日期。 复杂度分析: - 时间复杂度:$O(Q \times Y)$,其中 $Q$ 是询问的组数,$Y$ 是平均需要处理的年数。 - 空间复杂度:$O(Q)$,主要用于存储输入的儒略日。 ######[AI问答 | 1156点数解答 | 2026-02-08 19:36:11]
- C++求解序列或与运算和差值:避O(nq)复杂度及数据处理要点(字节豆包 | 534点数解答 | 2025-10-17 20:05:07)62
- 数字化制图综合平台:助力企业转型,推动烟草物流图纸智能化设计 (字节豆包 | 490点数解答 | 2024-10-30 20:30:29)146
- 数字化制图综合平台:引领烟草物流及多领域设计革新 在企业数字化转型的时代浪潮中,数字化制图技术创新应用成为产业升级与提升竞争力的关键。企业对高效、精准、智能化设计解决方案需求迫切,构建集二维到三维正逆向工程快捷化、干涉检测可视化、设备明细数据提取自动化以及设备模块模型库于一体的综合平台意义重大。 此平台集成先进数字化制图工具与智能算法,可实现二维设计到三维建模的无缝转换,大大缩短设计周期。正逆向工程能快速切换,满足不同场景设计需求。内置干涉检测功能可实时监测设计潜在冲突,保障设计方案可行与安全。设备明细数据自动提取提高设计准确性与效率。设备模块模型库为设计师提供丰富资源,支持设计标准化与模块化,加速项目推进。 整体来看,该综合平台的应用极大促进了烟草物流行业及更广泛领域的技术创新与效率提升。在烟草物流方案图纸智能化设计中,它提升了图纸设计效率与质量,使设计工作更加高效、精准。对于企业而言,这一平台带来显著竞争优势,能帮助企业在数字化转型中脱颖而出,在激烈的市场竞争中占据有利地位,推动整个行业向更高效、更智能的方向发展。 (阿里通义 | 216点数解答 | 2024-10-30 20:30:51)175
- Java 实现:轻松生成 5 位数字、大小写字母混合验证码( | 266点数解答 | 2024-03-06 17:39:10)332
- 深度剖析:游戏中两个 Buff 效果的触发条件、逻辑及注意要点 (阿里通义 | 566点数解答 | 2024-11-26 14:24:12)262
- 深度剖析 Vue 2 插槽:从基础使用到高级玩法(字节豆包 | 165点数解答 | 2024-11-29 11:25:06)216
- C++实现支持四则运算的简单计算器,处理除数为0和无效操作(字节豆包 | 241点数解答 | 2025-10-29 20:21:29)64
- C语言破解甲乙丙真假话谜题:开发中需留意的三大要点(字节豆包 | 444点数解答 | 2025-11-24 00:10:58)53
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)74
- C++ 实现根据输入正整数奇偶性计算偶数和或约数和(字节豆包 | 838点数解答 | 2026-02-28 20:23:59)28
- Excel 日期格式显示####?这些解决办法快收好!( | 327点数解答 | 2023-12-29 09:53:45)281
- Java实现日程管理系统:添加、修改、查询与提醒一应俱全,数据本地txt保存!(GPT | 5818点数解答 | 2024-06-03 20:02:47)345