HDU 2133---某年某月某日是星期几?

本文介绍两种将日期转换为星期的方法,包括自定义公式法和基姆拉尔森计算公式法,并提供C语言实现代码。

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

题目描述

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

solve 1:

公式:W = month+365*(year-1)+r+day

W是公元1年1月1日所给日期所积天数

365*(year-1)+r是公元1年1月1日所给年1月1日所积天数

month是所给年1月1日所给日期所积天数

day是所给月1日所给日期所积天数

 

代码

#include<stdio.h>

int run(int year)
{
	return (year%4==0&&year%100!=0||year%400==0);
}
int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};



int main()
{
	int year,month,day;
	
	while(~scanf("%d%d%d",&year,&month,&day))
	{
		 if(run(year))
		 {
		 	b[2]=29;
		 }
		 else
		 {
		 	b[2]=28;
		 }
		 if(day>b[month]||year<1||year>10000||day<1||month<1||month>12)
		 {
		 	printf("illegal\n");
		 	continue;
		 }
			int W=0,r=0;
			for(int i=1;i<year;i++)
			{
				if(run(i))
				{
					r++;//标记有几个闰年
				}
			}
			for(int j=1;j<month;j++)
			{
				W=W+b[j];
			}
		
			W = W+365*(year-1)+r+day; //r为多的天数,有几个闰年多几天
			int p=W%7;//最终的W代表从公元1年到题给的日期所积的天数,取余7得星期数
			switch(p)
				{
					case 0:
						printf("Sunday\n");
						break;
					case 1:
						printf("Monday\n");
						break;
					case 2:
						printf("Tuesday\n");
						break;
					case 3:
						printf("Wednesday\n");
						break;
					case 4:
						printf("Thursday\n");
						break;
					case 5:
						printf("Friday\n");
						break;
					case 6:
						printf("Saturday\n");
						break;
					
				}
	
	}
	return 0; 
}

solve 2:

基姆拉尔森计算公式:

w=day+month*2 + 3*(month + 1) / 5 + year + year/4 - year/100 + year/400 + 1   ;

 

代码:

 

#include<stdio.h>

int run(int n)
{
	return  (n%4==0&&n%100!=0)||(n%400==0);
}

int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
	int d,m,y,w;
	while(~scanf("%d%d%d",&y,&m,&d))
	{
		if(run(y))
		{
			a[2]=29;
		}
		else
		{
			a[2]=28;
		}
		
		if(d<1||d>a[m]||m<1||m>12||y<1||y>10000)
		{
			printf("illegal\n");
		}
		else
		{
			if(m==1|m==2)
			{
				m=m+12;
				y--;
			}
			w=(d+m*2+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
			switch(w)
			{
				case 0:
						printf("Sunday\n");
						break;
					case 1:
						printf("Monday\n");
						break;
					case 2:
						printf("Tuesday\n");
						break;
					case 3:
						printf("Wednesday\n");
						break;
					case 4:
						printf("Thursday\n");
						break;
					case 5:
						printf("Friday\n");
						break;
					case 6:
						printf("Saturday\n");
						break;

			}
			
		}
	}
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值