1502131514-蓝桥杯-算法提高 日期计算

算法提高 日期计算  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。
输入格式
  输入只有一行
  YYYY MM DD
输出格式
  输出只有一行
  W
数据规模和约定
  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日
样例输入
2011 11 11
样例输出
5
  解题思路
     计算出给定日期与2011.11.11的差值,然后对7取余,与周五相比较运算,给出答案。
     注意2011.11.11前和后的日期计算星期的时候不一样。
     计算日期差值的时候,可以先计算年之间的差值,然后在计算两边月份的差值,最后再弄日的。
代码
#include<stdio.h>
int leap(int a)
{
	if(a%400==0||(a%4==0&&a%100!=0))
	    return 366;
	else
	    return 365;
}
int day(int a,int b)
{
	if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
	    return 31;
	else if(b==4||b==6||b==9||b==11)
	    return 30;
	else
	{
		if(leap(a)==366)
		    return 29;
		else
		    return 28;
	}
}
int nian(int a)
{
	int i;
	int sum=0;
	if(a==2011)
	{
		return sum;
	}
	else if(a<2011)
	{
		for(i=a+1;i<2011;i++)
		    sum+=leap(i);
		return sum;
	}
	else if(a>2011)
	{
		for(i=2012;i<a;i++)
		    sum+=leap(i);
		return sum;
	}
}
int yue(int a,int b,int c,int d)
{
	int i,j;
	int sum=0;
	for(i=b+1;i<13;i++)
	    sum+=day(a,i);
	for(i=1;i<d;i++)
	    sum+=day(c,i);
	return sum;
}
int answer(int a)
{
	if(a==5)
	    return 5;
	else if(a==6||a==-1)
	    return 6;
	else if(a==7||a==0)
	    return 7;
	else if(a==8||a==1)
	    return 1;
	else if(a==9||a==2)
	    return 2;
	else if(a==10||a==3)
	    return 3;
	else if(a==11||a==4)
	    return 4;
}
int main()
{
	int a,b,c;
	int sum;
	int chaa,chab,chac;
	int i,j,k;
	while(scanf("%d%d%d",&a,&b,&c)!=EOF)
	{
		sum=0;
		sum+=nian(a);
		if(a<2011)
		{
		    sum+=yue(a,b,2011,11);
		    sum+=(day(a,b)-c+11);
		}
		else if(a>2011)
		{
		    sum+=yue(2011,11,a,b);
		    sum+=(day(2011,11)-11+c);
		}
		else
		{
		    sum+=yue(2011,12,2011,11);
		    sum+=11;
		}
		sum%=7;
		if(a>2011)
		    sum+=5;
		else if(a<2011)
		    sum=5-sum;
		else
		{
			if(b<11)
			    sum=5-sum;
			else if(b>11)
			    sum+=5;
			else
			{
				if(c>11)
				    sum+=5;
				else if(c<11)
				    sum=5-sum;
				else
				    sum=5;
			}
		}
		printf("%d\n",answer(sum));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值