按照日期推算出星期几

#include <stdio.h>

char WeekList[ ][7]={"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};

void dateToWeek(int y,int m, int d)
{
    if (m==1 || m==2)
    {
        m+=12;
        y--;
    }
    int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
    printf("%s\n", WeekList[iWeek]);
}
int main()
{
    int year=0,month=0,day=0;
    
	printf("请输入日期(2000-1-1):");
    scanf("%d-%d-%d",&year,&month,&day);
    dateToWeek(year,month,day);

    return 0;
}

/*
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月
*/ 


我以前的笨办法是这样的:

#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
	int Month_Day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
	const char Week[7][7] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
	int year,month,day;
	int STDyear = 2010, STDmonth = 10, STDday = 31, STDweekday = 6;//STDweekday是参考日期的星期几,对应Week下标 
	int Alldays = 0;		//与标准日期的间隔总天数 
	int diff_Flag = 0;		//0表示输入时间小于标准时间,1表示大于 
	int WeekToday = 0;
	
	
	scanf("%d-%d-%d", &year, &month, &day);
	//cout<<year<<month<<day;
	if((year < STDyear) || ((year == STDyear) && (month <= STDmonth)))
	{
		diff_Flag = 0;
		while((year != STDyear) || (month != STDmonth) || (day != STDday))
		{
			Alldays++;
			day++;
			if(2 == month)
			{
				if(((year % 4 ==0) && (year % 100 != 0)) || (year % 400 == 0))
				{
					Month_Day[1] = 29;//闰年2月29天 
				}
				else
				{
					Month_Day[1] = 28;
				}
			}
			if(day > Month_Day[month - 1])//前面考虑闰年 
			{
				day = 1;
				month++;
				if(month > 12)
				{
					month = 1;
					year++;
				}
			}
		}
	}
	else
	{
		diff_Flag = 1;
		while((year != STDyear) || (month != STDmonth) || (day != STDday))
		{
			Alldays++;
			day--;
			if(2 == month)
			{
				if(((year % 4 ==0) && (year % 100 != 0)) || (year % 400 == 0))
				{
					Month_Day[1] = 29;//闰年2月29天 
				}
				else
				{
					Month_Day[1] = 28;
				}
			}
			if(day < 1)
			{
				month--;
				if(month < 1)
				{
					month = 12;
					year--;
				}
				day = Month_Day[month - 1];//前面考虑闰年 
			}
		}
	}
	cout<<"间隔"<<Alldays<<"天"<<endl;
	if(diff_Flag == 0)
	{
		WeekToday = STDweekday - (Alldays % 7);
	}
	else
	{
		WeekToday = (Alldays + STDweekday) % 7;
	}
	cout<<Week[WeekToday]<<endl;
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值