C++练习题:查星期

【问题描述】
已知1980年1月1日是星期二 ,任意输入一个日期,求这一天是星期几。
从键盘输入一行字符串Y-M-D,是一个有效的公历日期,其中Y为年,M为月,D为天,都不带有前缀0。
输出只有一行,是代表该日星期的字符串,对于星期一至星期日,分别输出Monday、Tuesday,Wednesday、Thursday、Fhiday、Saturday、Sunday,在行未要的出一个回车符。

#include<iostream>
using namespace std;
int main()
{
	int a=0;
	int i,y,m,d;
	int b[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	cin>>y>>m>>d;
	
	for(i=1980;i<y;i++)
	{
		if((i%4==0 && i%100!=0) || i%400==0)
		{
			a+= 2;
		}
		else
		{
			a++;
		}
	 } 
	 
	 if((y%4==0 && y%100!=0) || y%400==0)
	 {
	 	b[1]=29;
	 }
	 
	 for(i=0;i<m;i++)
	 {
	 	a+= b[i];
	 }
	 
	 a=(a+d)%7;
	 
	 switch(a)
	 {
	 	case 0: cout<<"Monday";
		break;
		
		case 1: cout<<"Tuesday";
		break; 
		
		case 2: cout<<"Wednesday";
		break;
		
		case 3: cout<<"Thursday";
		break;
		
		case 4: cout<<"Friday";
		break;
		
		case 5: cout<<"Saturday";
		break;
		
		case 6: cout<<"Sunday";
		break;
	 }
}

【思路解析】

//补充下:判断闻年,年份能被4整除井且不能被100整除,或者能被四百整除。闰年就是2月有29天。

1.1980年1月1日是星期二,所以从1979年12月31日算为第0天,是星期一。1980,1月1日当作第一天。所以从第0天开始,经历到第七天或者第七的倍数(即取余为零)的天数时为星期一不变。如果所经历天数除以七,取余为一,则往后推一天就是星期二,以此类推。

2.因为从1980年1月1日开始,到y年m月d日。期间所经历的时间可以分为三部分。

第一部分: 是1980年1月1日——y-1年12月31日(y年1月1日前一天)的时间

因为期间一般每过一年是365天,就是除以7余数为1,所以每过一年就是同个日期往后推一个星期几。

但是闰年的时候就是366天,就是除以7余数为1,所以每过一年就是同个日期往后推两个星期几。

这样就不用算其中的总天数,把各年取余算推迟的总和。

第二部分:  是y年1月1日到m-1月底(m月1日前一天)

设置一个数组b,里面为各个月的天数,并设置二月初始值为28。然后判断y年是否为闰年,如果是闰年的话先把该数组中的二月赋值为29。然后用for循环从第一个月累积加到第m个月,求其中的总和。可以像第一部分取余,也可以先不取因为第二部分的天数不多。

第三部分:是m月1日-m月d日

直接取d就是他们之间的天数,可以像第一部分取余,也可以先不取因为第三部分的天数也不多。

3.最后就是把三部分加起来再除以7取余,然后用switch拿取余后结果判断是星期几即可

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值