给出一个年份范围,枚举 xxxx年1月1日星期x ~ xxxx年12月31日星期x。
主要知识:闰年判断、日期计算、星期循环。直接上代码:
单纯枚举日期:
#include <stdio.h>
int mdaynum(int year,int month) //求该月天数
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31;
case 4:
case 6:
case 9:
case 11: return 30;
default:
return
28+(year%400==0 || (year%4==0 && year%100!=0));//闰年判断
}
}
void Date() //日期枚举算法
{
printf("\n=======日期枚举=======\n");
for(int y=1999;y<=2000;y++)
{
for(int m=1;m<=12;m++)
{
int maxd = mdaynum(y,m);
for(int d=1;d<=maxd;d++)
{
printf("Y=%d M=%d D=%d\n",y,m,d);
}
}
}
}
int main()
{
Date();
return 0;
}
单纯枚举星期:
#include <stdio.h>
void Week() //星期枚举算法
{
printf("\n=======星期枚举=======\n");
int w=1,n=14;
int week[7]={1,2,3,4,5,6,7};
for(int j=0,i=w;j<n;j++)
{
if(i>=1 && i<=6)
{
printf("星期%d\n",week[i-1]);
i++;
continue;
}
if(i==7)
{
printf("星期%d\n",week[i-1]);
i=1;
continue;
}
}
}
int main()
{
Week();
return 0;
}
日期+星期同步枚举:
#include <stdio.h>
int mdaynum(int year,int month) //求该月天数
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31;
case 4:
case 6:
case 9:
case 11: return 30;
default:
return
28+(year%400==0 || (year%4==0 && year%100!=0));//闰年判断
}
}
int ydaynum(int firstyear,int lastyear) //求年份范围内天数
{
int ans=0;
if(firstyear<=lastyear)
{
for(int i=firstyear;i<lastyear;i++)
{
if(i%400==0 || (i%4==0 && i%100!=0))
ans+=366;
else
ans+=365;
}
}
if(firstyear>lastyear)
{
for(int i=firstyear;i>lastyear;i--)
{
if(i%400==0 || (i%4==0 && i%100!=0))
ans+=366;
else
ans+=365;
}
}
}
void Date_Week() //日期+星期枚举算法
{
int firstyear=1995 , lastyear=2005; //要遍历的日期范围
int week[7]={1,2,3,4,5,6,7}; //一周
int w=6+ydaynum(firstyear,2000)%7+1; //以2000年1月1日星期六为基准日
for(int y=firstyear;y<=lastyear;y++)
{
for(int m=1;m<=12;m++)
{
int maxd = mdaynum(y,m);
for(int d=1;d<=maxd;d++)
{
printf("Y=%d M=%d D=%d ",y,m,d);
if(w>=1 && w<=6)
{
printf("星期%d\n",week[w-1]);
w++;
continue;
}
if(w==7)
{
printf("星期%d\n",week[w-1]);
w=1;
continue;
}
}
}
}
}
int main()
{
Date_Week();
return 0;
}
运行效果与验证: