社区讨论
【无事氵】相对较空的小伙伴来评价一下码风
灌水区参与者 10已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @locyl3p7
- 此快照首次捕获于
- 2023/10/30 21:51 2 年前
- 此快照最后确认于
- 2023/11/05 08:13 2 年前
题目是今年CSP的儒略日
CPP#include<bits/stdc++.h>
#define int long long
#define reg register
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
using namespace std;
int read(){
int x=0,f=0;
char ch=0;
while(!isdigit(ch))f|=(ch=='-'),ch=getchar();
while(isdigit(ch))(x*=10)+=(ch^48),ch=getchar();
return f?-x:x;
}
int Day;
const int
_DaysForMonth[]={-1,31,-1,31,30,31,30,31,31,30,31,30,31},
_DaysEveryFourYear=1461,
_FirstYearBCE=4713,
_FirstYearCE=1,
_FirstYearGregorian=1582,
_FirstMonth=1,
_FirstDay=1,
_DaysLeapYear=366,
_DaysCommonYear=365,
_MonthsEveryYear=12,
_DaysBeforeCE=1721423,
_DaysBeforeGregorian=2299160,
_DaysForFebInLeapYear=29,
_DaysForFebInCommonYear=28,
_DaysEveryFourHundredsYear=146097;
namespace BCE{
bool isLeapYear(const int _Year){
return (_Year-1)%4==0;
}
void Main(const int _Day){
int Days_Untreated=_Day;
int Year_Now=_FirstYearBCE,Month_Now=_FirstMonth,Day_Now=_FirstDay;
Year_Now-=Days_Untreated/_DaysEveryFourYear*4;
Days_Untreated%=_DaysEveryFourYear;
int Days_To_Year=_DaysLeapYear;
while(Days_Untreated>Days_To_Year){
Days_Untreated-=Days_To_Year;
Year_Now--;
if(isLeapYear(Year_Now)){
Days_To_Year=_DaysLeapYear;
}
else{
Days_To_Year=_DaysCommonYear;
}
}
int Days_To_Month=_DaysForMonth[Month_Now];
while(Days_Untreated>=Days_To_Month){
Days_Untreated-=Days_To_Month;
Month_Now++;
if(Month_Now>_MonthsEveryYear){
Month_Now=_FirstDay;
Year_Now--;
if(isLeapYear(Year_Now)){
Days_To_Year=_DaysLeapYear;
}
else{
Days_To_Year=_DaysCommonYear;
}
}
if(Month_Now==2){
if(isLeapYear(Year_Now)){
Days_To_Month=_DaysForFebInLeapYear;
}
else {
Days_To_Month=_DaysForFebInCommonYear;
}
}
else{
Days_To_Month=_DaysForMonth[Month_Now];
}
}
Day_Now+=Days_Untreated;
printf("%lld %lld %lld BC\n",Day_Now,Month_Now,Year_Now);
}
}
namespace CEBeforeGregorian{
bool isLeapYear(const int _Year){
return _Year%4==0;
}
void Main(const int _Day){
int Days_Untreated=_Day-_DaysBeforeCE-1;
int Year_Now=_FirstYearCE,Month_Now=_FirstMonth,Day_Now=_FirstDay;
Year_Now+=Days_Untreated/_DaysEveryFourYear*4;
Days_Untreated%=_DaysEveryFourYear;
int Days_To_Year=_DaysCommonYear;
while(Days_Untreated>Days_To_Year){
Days_Untreated-=Days_To_Year;
Year_Now++;
if(isLeapYear(Year_Now)){
Days_To_Year=_DaysLeapYear;
}
else{
Days_To_Year=_DaysCommonYear;
}
}
int Days_To_Month=_DaysForMonth[1];
while(Days_Untreated>=Days_To_Month){
Days_Untreated-=Days_To_Month;
Month_Now++;
if(Month_Now>_MonthsEveryYear){
Month_Now=_FirstMonth;
Year_Now++;
if(isLeapYear(Year_Now)){
Days_To_Year=_DaysLeapYear;
}
else{
Days_To_Year=_DaysCommonYear;
}
}
if(Month_Now==2){
if(isLeapYear(Year_Now)){
Days_To_Month=_DaysForFebInLeapYear;
}
else {
Days_To_Month=_DaysForFebInCommonYear;
}
}
else{
Days_To_Month=_DaysForMonth[Month_Now];
}
}
Day_Now=Day_Now+Days_Untreated;
printf("%lld %lld %lld\n",Day_Now,Month_Now,Year_Now);
}
}
namespace CEAfterGregorian{
bool isLeapYear(const int _Year){
return (_Year%4==0&&_Year%100!=0)||(_Year%400==0);
}
void Main(const int _Day){
const int _DaysCompensated=287;
int Days_Untreated=_Day-_DaysBeforeGregorian-1+_DaysCompensated;
//Return 287 days so we can solve the problem in 1582.1.1
//Because we know the date must be later than 1582.10.15
//Although the 1582.10.5-1582.10.14 is nonexistent
//But we can compensate the date 287 days to make our problem easier
int Year_Now=_FirstYearGregorian,Month_Now=_FirstMonth,Day_Now=_FirstDay;
Year_Now+=Days_Untreated/_DaysEveryFourHundredsYear*400;
Days_Untreated=Days_Untreated%_DaysEveryFourHundredsYear;
int Days_To_Year=_DaysCommonYear;
while(Days_Untreated>Days_To_Year){
Days_Untreated-=Days_To_Year;
Year_Now++;
if(isLeapYear(Year_Now)){
Days_To_Year=_DaysLeapYear;
}
else{
Days_To_Year=_DaysCommonYear;
}
}
int Days_To_Month=_DaysForMonth[Month_Now];
while(Days_Untreated>=Days_To_Month){
Days_Untreated-=Days_To_Month;
Month_Now++;
if(Month_Now>_MonthsEveryYear){
Month_Now=_FirstMonth;
Year_Now++;
if(isLeapYear(Year_Now)){
Days_To_Year=_DaysLeapYear;
}
else{
Days_To_Year=_DaysCommonYear;
}
}
if(Month_Now==2){
if(isLeapYear(Year_Now)){
Days_To_Month=_DaysForFebInLeapYear;
}
else {
Days_To_Month=_DaysForFebInCommonYear;
}
}
else{
Days_To_Month=_DaysForMonth[Month_Now];
}
}
Day_Now=Day_Now+Days_Untreated;
printf("%lld %lld %lld\n",Day_Now,Month_Now,Year_Now);
}
}
signed main(){
for(reg int T=read();T;T--){
Day=read();
if(Day<=_DaysBeforeCE) {
BCE::Main(Day);
}
else{
if(Day<=_DaysBeforeGregorian) {
CEBeforeGregorian::Main(Day);
}
else {
CEAfterGregorian::Main(Day);
}
}
}
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...