HDU2133(日期计算)

本文介绍了一种将指定日期转换为对应星期的算法,并通过示例演示了如何判断输入日期的有效性及计算其对应的星期几。该算法适用于解决日常计算中关于日期与星期对应的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

What day is it

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2921    Accepted Submission(s): 858


Problem Description
Today is Saturday, 17th Nov,2007. Now, if i tell you a date, can you tell me what day it is ?
 

Input
There are multiply cases.
One line is one case.
There are three integers, year(0<year<10000), month(0<=month<13), day(0<=day<32).
 

Output
Output one line.
if the date is illegal, you should output "illegal". Or, you should output what day it is.
 

Sample Input
2007 11 17
 

Sample Output
Saturday
 
 
#include<iostream>
#include<cstdio>
using namespace std;

typedef struct
{
	int year,mon,day;
}Yer;

int month[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  


bool is_leap(int year)
{
	if((year%4==0&&year%100)||(year%400==0))
		return true;
	return false;
}

bool is_legal(Yer cur)
{ 
	if(cur.year<= 0||cur.year>=10000||cur.mon<=0||cur.mon>=13||cur.day<=0||cur.day>=32)  
        return false;  
	if((!is_leap(cur.year)&&cur.day<=month[cur.mon])||(cur.mon==2&&is_leap(cur.year)&&cur.day<=month[cur.mon]+1))
		return true;
	else 
	return false;
}

bool is_pre(Yer a,Yer b)
{
	if(a.year<b.year)
		return true;
	else if(a.year==b.year&&a.mon<b.mon)
		return true;
	else if(a.year==b.year&&a.mon==b.mon&&a.day<b.day)
		return true;
	else a
		return false;
}

void print(bool flag,int sum)
{
	sum=sum%7;
	if(!flag)
		sum=7-sum;
	sum=sum%7;
	switch(sum)
	{
	case 0:printf("Saturday\n");break;
	case 2:printf("Monday\n");break;
	case 3:printf("Tuesday\n");break;
	case 4:printf("Wednesday\n");break;
    case 5:printf("Thursday\n");break;
	case 6:printf("Friday\n");break;
	case 1:printf("Sunday\n");break;
	}
	return ;
}

void calculate(bool flag,Yer a,Yer b)
{
	int i,sum;
	int ta,tb;
	sum=0;
	ta=0;
	int taa=365;
	for(i=1;i<a.mon;i++)
	{
		if(i==2&&is_leap(a.year))
		{
			ta+=1;
			taa=366;
		}
		ta+=month[i];
	}
	ta+=a.day;
	tb=0;
	for(i=1;i<b.mon;i++)
	{
		if(i==2&&is_leap(b.year))
		{
			tb+=1;
		}
		tb+=month[i];
	}
	tb+=b.day;

	if(a.year==b.year)
	{
		sum=tb-ta;
		print(flag,sum);
		return ;
	}

	for(i=a.year+1;i<b.year;i++)
	{
		if(is_leap(i))
			sum+=1;
		sum+=365;
	}

	sum=sum+taa-ta+tb;
	print(flag,sum);
	return;
}

int main()
{
	Yer cur,fixed;
	fixed.year=2007;
	fixed.mon=11;
	fixed.day=17;
	while(~scanf("%d%d%d",&cur.year,&cur.mon,&cur.day))
	{
		if(!is_legal(cur))
		{
			printf("illegal\n");
			continue;
		}
		if(is_pre(fixed,cur))
			calculate(true,fixed,cur);
		else 
			calculate(false,cur,fixed);

	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值