hdu 1308 What Day Is It? (算星期几)

这题就是一道很常见的算星期的题目,给你年月日,求改天星期几

不过这题和某渣平时碰到的有点不一样,平时的算星期,可以采用蔡勒公式直接求解

蔡勒公式详情见http://baike.baidu.com/link?url=k75Ks72KBxf-rZq5nubcDwsXogkBE1-8ALWCq_Ew1b_B8rNk9gIsyUbHFxiMBHoh 

这题有两个特殊条件:

条件一: 1528年之前 闰年的规则为%4==0 即可,1528年之后  闰年的规则为 (n%4==0&&n%100) || n%400==0

条件二:  1752年9月2日到  1752年9月14日之间的11天是不存在的, 即1752年9月2日为星期三  1752年9月14日为星期四

方法:

先判断该天是否合法,然后:

不考虑消失11天, 若该天在1752年9月2日 之前, 则用 1年1月1日 (星期日)为参考点去计算

否则则用 1752年9月14日为星期四 为参考点去计算, 计算日子的总和时加一个特判,把1528之前的年的天数和1528年之后的年的天数分开判断

 

代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;

int pd1(int y,int m,int d)
{
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if((y<=1582) && (y%4) )
		a[2]++;
	else if((y> 1582) &&  (y%4== 0 && y%100) || (y%400== 0) )
		a[2]++;
	if(d> 0 && d<= a[m])
	{
		int sum= 0;
		for(int i= 1; i< y; i++)
		{
			if(i<= 1582)
			{
				if(i%4==0)
				{
					sum+= 366;
				}
				else
					sum+= 365;
			}
			else
			{
				if( (i%4== 0 && i%100) || (i%400== 0) )
					sum+= 366;
				else
					sum+= 365;	
			}
		}
		for(int i= 1; i< m; i++)
			sum+= a[i];
		sum+= d;	
		return sum;
	}
	return 0;	
}
int main()
{
	char b[7][10] = {"Sunday","Monday","Tuesday","Wednesday",
	"Thursday","Friday","Saturday"};
	char c[13][20] ={"0","January","February","March","April",
	"May","June","July","August","September","0ctober","November","December"};
	int y,m,d;
	while(scanf("%d%d%d",&m,&d,&y)!=EOF&& y+ m +d)
	{
		int sum= pd1(y,m,d);
		//printf("%d\n",sum);
		if(!sum)
		{
			printf("%d/%d/%d is an invalid date.\n",m,d,y);
			continue;
		}
		int flag= 0;
		if(y>1752)
		{
			flag= 1;
		}
		else if(y==1752)
		{
			if(m > 9)
				flag= 1;
			else if(m==9)
			{
				if(d>= 14)
					flag= 1;
			}	
		}
		//判断改天是在星期修改前还是修改后		
		if(flag==0)
		{
			// 1年1月1日为星期日 
			int w= (sum -1)% 7;
			printf("%s %d, %d is a %s\n",c[m],d,y,b[w]);
		}
		else
		{
			//当日子为 1752年9月14日时,函数返回639809天,此时为星期四 
			int w= (sum- 639805) % 7;
			printf("%s %d, %d is a %s\n",c[m],d,y,b[w]); 
		} 
	}
	return 0;
}


 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值