题目:给定 三个整数 代表年月日,求出今天是今年的第几个周几。年份从1900开始,已知1900 1月 1 日为周一。
输出格式:两个整数 a b 其中b取值1-7代表周几。
算法:
1、周几
weekday = ((days-1)%7+1)%7;
先计算出今年是从1900 1 1开始的第几天days,然后days-1是今天距离1900 1 1的距离,比如1900 1 2, days==2;然后(days-1)%7是除去了很多个星期后距离周一(1900 1 1为周一)的距离,(days-1)%7+1,后面这个1是周一的意思;然后再%7,这是通解。其实这一题没有必要多次一举,因为已知1900 1 1为周一,(days-1)%7+1得到的结果就是1-7。再%7在给定日期与周几的情况下算的,比如2022 6 25 是周六 那么 weekday = ((days-1)%7+6)%7;不%7的话结果不正确的。
2、第几个周几
th = 1+(days-1)/7;
注意这个days与上文的days不相同,这个是从今年1月1日开始的第几天。同样的days-1是距离1月1日的距离,显然从第一周开始,距离小于7就还在第一周,距离大于等于7就进入下一周。比如1月1日周3,1月8日就是第二个周三。如果1月 1 日是周一,1月8日就是第二个周一。可以发现第几个周与1月1日是周几没有关系。
代码:
#include<stdio.h>
void getDays(int y,int m,int d){
int days=0;
int x=28;
int i=0;
if(y%4==0&&y%100!=0||y%400==0)
x=29;
switch(m){
case 12:days+=30;
case 11:days+=31;
case 10:days+=30;
case 9:days+=31;
case 8:days+=31;
case 7:days+=30;
case 6:days+=31;
case 5:days+=30;
case 4:days+=31;
case 3:days+=x;
case 2:days+=31;
}
days=d+days;// days是今天是今年的第几天
int th = 1+(days-1)/7; //days-1是与第一天的距离,计算得到第几个星期
for(i=1900;i<y;i++){ //计算从1900 1 1开始的日期数
if(i%4==0&&i%100!=0||i%400==0)
days+=366;
else
days+=365;
}
//现在的days与上面的不是同一个含义
int weekday = (days-1)%7+1; // days-1是距离,第二个1是周1,周一加上取余后的距离得到周几
printf("%d %d\n",th,weekday);
}
int main(){
int n,y,m,d;
scanf("%d",&n);
while(n--){
scanf("%d%d%d",&y,&m,&d);
getDays(y,m,d);
}
}
PS:这是做题记录,主要供自己复习,仅供参考,时间紧迫,可能有漏误,请谅解