1 条题解

  • 0
    @ 2025-5-13 22:36:16

    解题思路

    我们需要计算从200020001111日(星期六)开始,经过给定的天数后的日期和星期几。关键在于:

    计算年份:

    20002000年开始,逐年减去每年的天数(365365366366),直到剩余天数不足以构成一整年。

    计算月份:

    在确定的年份中,逐月减去每月的天数(2828/2929/3030/3131),直到剩余天数不足以构成一整月。

    计算日期:

    剩余的天数+1+1即为当月的日期(因为天数从00开始计算)。

    计算星期几:

    由于200020001111日是星期六,因此(nn % 77)可以映射到星期几(SaturdaySaturday对应nn % 77 == 00)。

    解题方法

    判断闰年:

    普通闰年:

    能被44整除但不能被100100整除。

    世纪闰年:

    能被400400整除。

    计算年份:

    初始年份是20002000年,初始剩余天数为输入的天数n。

    循环判断当前年份是否为闰年,并减去相应的天数(365365366366),直到剩余天数不足一整年。

    计算月份:

    11月到1212月,逐月减去该月的天数,直到剩余天数不足一整月。

    计算日期:

    剩余天数+1+1即为当前月的日期。

    计算星期几:

    由于200020001111日是星期六,因此(nn % 77)可以映射到星期几:

    00SaturdaySaturday

    11SundaySunday

    22MondayMonday

    33TuesdayTuesday

    44WednesdayWednesday

    55ThursdayThursday

    66FridayFriday

    C++代码实现:

    #include <stdio.h>
    int isRunNian(int n)
    {
     if(n%400==0||(n%4==0&&n%100!=0))
     return 1;
     else
     return 0;
    }//是否为闰年
    int monthdate(int i,int m)
    {
     int date;
     if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
     date=31;
     if(i==4||i==6||i==9||i==11)
     date=30;
     if(i==2)
     {
      if(isRunNian(m))
      date=29;
      else
      date=28;
     }
     return date;
    }//这个月多少天
    int main()
    {
     int n;
     char week[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
     while(scanf("%d",&n)&&n!=-1)
     {
      int i,j,k,t,m;
      i=2000;j=1;t=366;k=31;m=n;
      while(m/t>0)
      {
       i++;
       m-=t;
          if(isRunNian(i))
          t=366;
          else
          t=365;
      }//计算年份
      while(m/k>0)
      {
       j++;
       m-=k;
       k=monthdate(j,i);
      }//计算月份
      printf("%d-%02d-%02d ",i,j,m+1);
      printf("%s\n",week[(n-1)%7]);
     }
     return 0;
    }
    • 1

    信息

    ID
    1081
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者