码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2133

时间:2014-12-26 20:24:36      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:acm算法   amp   math.h   c   printf   

技术分享What day is it

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


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

Author
LGX

Source

 

题目意思很简单,给你一个日期,让你输出是星期几。。这题其实非常的蛋疼。。我写了好长。。主要思想就是求出总天数,用总天数%7。得到相应的星期几。

下面附上代码带详细解析、代码如下。。

#include <stdio.h>
#include<string.h>
void solve()
{
	char str[7][12]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};   //用一个二维数组存放星期几。
	int y,m,d,i;
    while(~scanf("%d%d%d",&y,&m,&d))  //输入y,m,d。分别代表年月日。
	{
		if(y<=0 )
		{
			printf("illegal\n");  //  如果年份小于0,则不合法。
			continue;
		}
		__int64 sum=0;
		__int64 sum1=0;
		for(i=1;i<y;i++)
		{	
			if((i%4==0 && i%100!=0) ||i%400==0)//  找出1到(Y-1)年时一共有几个闰年。比如Y==2007,求的是1到2006有几个闰年。
                sum1++;
		}
		sum+=(y-1-sum1)*365;//  计算1到2006非闰年的总天数。
		sum+=sum1*366;//  计算1到2007闰年总天数 ,Y年(2007年)这年单独算
		if((y%4==0 &&y%100!=0) ||y%400==0)//  如果这年是闰年的话
		{ 
			if(m==2 &&d>29) //2月份单独讨论。
			{
				printf("illegal\n");// 2月29不合法。
				continue;
			}
 			if(((m==1 || m==3 || m==5 ||m==7 || m==8 ||m==10 || m==12) &&d>31) || ((m==4 || m==6 ||m==9 ||m==11)&&d>30 ))//找出月份为30天的,大于30不合法,31天的,大于31不合法
			{
				printf("illegal\n");
				continue;
			}
			if(m>12 ||m <=0)  
			{
				printf("illegal\n");//月份大于12 或者等于0不合法
				continue;
			}
			if(m==0 ||d==0)//  月份等于0或者天数等于0不合法。
			{
				printf("illegal\n");
				continue;
			}
			if(m==1)
				sum+=d;
			if(m==2)
				sum+=31+d;
			if(m==3)
				sum+=31+d+29;
			if(m==4)
				sum+=31+d+29+31;
			if(m==5)
				sum+=31+d+29+31+30;
			if(m==6)
				sum+=31+d+29+31+30+31;
			if(m==7)
				sum+=31+d+29+31+30+31+30;
			if(m==8)
				sum+=31+d+29+31+30+31+30+31;
			if(m==9)
				sum+=31+d+29+31+30+31+30+31+31;
			if(m==10)
				sum+=31+d+29+31+30+31+30+31+31+30;
			if(m==11)
				sum+=31+d+29+31+30+31+30+31+31+30+31;
			if(m==12)
				sum+=31+d+29+31+30+31+30+31+31+30+31+30;//以上主要是算Y年这年的总天数。
			
		}
		else   //以下是非闰年的情况 将所有的29改成28就好
		{
			if(m==2 &&d>28)
			{
				printf("illegal\n");
				continue;
			}
			if(((m==1 || m==3 || m==5 ||m==7 || m==8 ||m==10 || m==12) &&d>31)|| ((m==4 || m==6 ||m==9 ||m==11)&&d>30 ))
			{
				printf("illegal\n");
				continue;
			}
			if(m>12 ||m <=0)
			{
				printf("illegal\n");
				continue;
			}
			if(m==0 ||d==0)
			{
				printf("illegal\n");
				continue;
			}//以上同上
			if(m==1)
				sum+=d;
			if(m==2)
				sum+=31+d;
			if(m==3)
				sum+=31+d+28;
			if(m==4)
				sum+=31+d+28+31;
			if(m==5)
				sum+=31+d+28+31+30;
			if(m==6)
				sum+=31+d+28+31+30+31;
			if(m==7)
				sum+=31+d+28+31+30+31+30;
			if(m==8)
				sum+=31+d+28+31+30+31+30+31;
			if(m==9)
				sum+=31+d+28+31+30+31+30+31+31;
			if(m==10)
				sum+=31+d+28+31+30+31+30+31+31+30;
			if(m==11)
				sum+=31+d+28+31+30+31+30+31+31+30+31;
			if(m==12)
				sum+=31+d+28+31+30+31+30+31+31+30+31+30;//2月变成28天。
		}
		if(sum%7==1)   //sum就是总天数了。一年一月一号是星期一。所以只要用总天数%7就能得到相应的星期几。
			printf("%s\n",str[0]);
		if(sum%7==2)
			printf("%s\n",str[1]);
		if(sum%7==3)
			printf("%s\n",str[2]);
		if(sum%7==4)
			printf("%s\n",str[3]);
		if(sum%7==5)
			printf("%s\n",str[4]);
		if(sum%7==6)
			printf("%s\n",str[5]);
		if(!(sum%7))
			printf("%s\n",str[6]);
	}// 问题得解
}
int main()
{
	solve();  //解决问题。
	return 0;
}


 

 

 

 

 

HDU 2133

标签:acm算法   amp   math.h   c   printf   

原文地址:http://blog.csdn.net/sky_miange/article/details/42174685

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!