本帖最后由 哒哒哒 于 2018-10-10 20:41 编辑
该算法是 /thread-1485-1-1.html 的移植版本。
- #include "reg51.h"
- #define U8 unsigned char
- #define U16 unsigned int
- #define U32 unsigned long
- U8 code fymt[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年月数表
- U8 code lymt[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年月数表
- U8 code fywt[12]={6,2,2,5,0,3,5,1,4,6,2,4}; //平年月代码
- U8 code lywt[12]={5,1,2,5,0,3,5,1,4,6,2,4}; //闰年月代码
- bit is_leap_year(U32 year){ //是否为闰年
- return (year %4 == 0 && year %100 !=0 || year %400 ==0);
- }
- U16 g1yd(U32 year){ //取当前年天数
- return is_leap_year(year)?366:365;
- }
- U32 gln(U32 year){ //取闰年数
- return year/4-year/100+year/400;
- }
- U32 gydn(U32 year){ //取年天数
- return year*365 + gln(year);
- }
- U8 ym2d(U32 year,U8 month){ //已知年月取1个月有多少天
- return is_leap_year(year) ? lymt[month-1] : fymt[month-1];
- }
- bit is_ymd(U32 y,U8 m,U8 d){ //检测年月日是否有效
- if(y < 0 || m <1 || d<1 || m >12) return 0;
- return d <= ym2d(y,m);
- }
- U8 g11w(U32 year){ //已知年求元旦(1月1日)是星期几
- return ((1+gydn(year)-g1yd(year))%7);
- }
- U8 ymd2w(U32 y,U8 m,U8 d){ //已知年月日求星期几 星期日为1 星期1为2 失败返回0
- U8 yw,yc,mc,w;
- bit leap=is_leap_year(y); //是否闰年
- if(!is_ymd(y,m,d)) return 0; //无效日期
- yw=g11w(y); //元旦星期
- yc=leap?((yw+2)%7):((yw+8)%7); //年代码
- mc=leap?lywt[m-1]:fywt[m-1]; //月代码
- w=(yc+mc+d)%7; //星期
- if(w == 0) w=7; //0则为星期6
- return w;
-
- }
- void main(){
- while(1){
- P3=ymd2w(2018,12,31);
- }
- }
复制代码
|