// 已知1999.12.31是周五 // 根据年月日,判断20XX年XX月XX日是 星期几 #include "stdio.h" unsigned int Year; unsigned int Month; unsigned int Day; //=============================================================================== //判断是否为闰年 //=============================================================================== // 公元纪年的年数可以被四整除且不能被100整除,即为闰年; // 被100整除也可被400整除的为闰年; // 被100整除而不能被400整除为平年; char Whether_LeapYear(unsigned int y) { return ( y%4==0 && y%100!=0 ) || (y%400==0); } //---------------------------------- // 验证每月最大天数 //---------------------------------- unsigned int Max_Valid_Day(unsigned int MonthTemp) { unsigned int MaxDay; switch(MonthTemp) { // 1.3.5.7.8.10.12月31天 case 1: case 3: case 5: case 7: case 8: case 10: case 12: MaxDay = 31; break; // 4.6.9.11月30天 case 4: case 6: case 9: case 11: MaxDay = 30; break; case 2: if(Whether_LeapYear(Year)) MaxDay = 29; // 闰年2月29天 else MaxDay = 28; // 平年2月28天 break; } return MaxDay; } //---------------------------------------- //求自2000.1.1开始的任何一天是星期几 //函数没有通过求出总天数,再求星期几 //因为求总天数可能会超过uint的范围 //---------------------------------------- unsigned int Get_WeekDay(unsigned int rYear,unsigned int rMonth,unsigned int rDay) { unsigned int i; unsigned int d; unsigned int w=5; //已知1999.12.31是周五 //从2000.1.1开始推算出(当前年i-1)年12.31是星期几(w) for(i=2000; i<rYear; i++) { d = Whether_LeapYear(i)? 366:365; w = (w + d) % 7; } //计算出当前所设置的年月日时该年的第几天 for(d=0,i=1; i<rMonth; i++) d += Max_Valid_Day(i); d += rDay; //根据w与d计算出当前【年/月/日】是星期几 //返回值是: 0 - 1 - 2 - 3 - 4 - 5 - 6 //对应星期: 日 一 二 三 四 五 六 return ((w + d) % 7); } void main(void) { while(1) { printf("请输入年月日\n"); scanf("%d%d%d",&Year,&Month,&Day); printf("%d年%d月%d日是周",Year,Month,Day); printf("%d \n",Get_WeekDay(Year,Month,Day)); printf("---------------------------------------\n\n"); } }
时间: 2024-10-12 02:26:37