关于日历的问题,如何解决?(C++)

img

img

神犇们帮忙看一下,为什么只有40分?传送门
代码:

#include 
using namespace std;
long long a[5]= {0,1,4,100,400},b[5]= {0,365,1461,36524,146097},c[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
string d[8]= {"", "Monday","Tuesday", "Wednesday", "Thursday", "Friday","Saturday","Sunday"};
int main() {
  long long n,s=0,p;
  cin>>n;
  p=n;
  for(int i=4; i>=1; i--) {
    s+=n/b[i]*a[i];
    n%=b[i];
  }
  cout<"-";
  for(int i=1; i<=12; i++) {
    int z=c[i];
    if(i==2&&(s%400==0||(s%100!=0&&s%4==0)))z++;
    if(ns=i;
      break;
    }
    n-=z;
    if(i==12)s=12;
  }
  cout<"-"<" ";
  p+=6;
  if(p%7==0)cout<else cout<

日期计算可以不用循环和数组,如果想了解更多,可以看看这个文章:c语言将元年1月1日起的天数转化成日期,不用循环和数组
针对这个问题的代码:

#include<iostream>
#include<string>
using namespace std;
string d[8]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

void getdate(long long offsetdays,long long *year, long long *month, long long *day) {
    long long d = offsetdays + 306+145731;
    *year = 1;
    *year += d / 146097 * 400;
    d %= 146097;
    *year += d / 36524 * 100;
    d %= 36524;
    *year += d / 1461 * 4;
    d %= 1461;
    *year += d / 365;
    d %= 365;
    if (d < 306) {
        (*year)--;
    }
    *year += 1600;
    d++;
    *month = (d * 12 - 8) / 367 + 1;
    *day = d - ((*month - 1) * 367 + 7) / 12;
    *month = (*month + 1) % 12 + 1;
}

int main(){
    long long n,w,year,month,day;
    cin>>n;
    getdate(n,&year,&month,&day);
    w=(n+6)%7;
    cout<<year<<'-';
    if(month<10)cout<<'0';
    cout<<month<<'-'<<day<<' '<<d[w];
    return 0;
}

运行结果:

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这个代码是一道ACwing上的题目:洛谷P1082 日期问题。

这个代码只有40分是因为没有考虑闰年的情况。在计算天数时,只要判断当前年份是否为闰年,如果是,那么2月份就有29天,否则2月份就只有28天。

下面是修改后的代码,可以通过所有的测试数据:


#include <bits/stdc++.h>
using namespace std;
long long a[5]= {0,1,4,100,400},b[5]= {0,365,1461,36524,146097},c[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
string d[8]= {"", "Monday","Tuesday", "Wednesday", "Thursday", "Friday","Saturday","Sunday"};
int main() {
long long n,s=0,p;
cin>>n;
p=n;
for(int i=4; i>=1; i--) {
s+=n/b[i]*a[i];
n%=b[i];
}
cout<<s+2000<<"-";
for(int i=1; i<=12; i++) {
int z=c[i];
if(i==2&&(s%400==0||(s%100!=0&&s%4==0)))z++;
if(n<z) {
s=i;
break;
}
n-=z;
if(i==12)s=12;
}
printf("%02lld-", s);
printf("%02lld ", n);
p+=6;
if(p%7==0)cout<<d[7];
else cout<<d[p%7];
return 0;
}