C语言计算今天是今年的第几个周几

题目:给定 三个整数 代表年月日,求出今天是今年的第几个周几。年份从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:这是做题记录,主要供自己复习,仅供参考,时间紧迫,可能有漏误,请谅解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值