已知任意的年份和月份顯示日曆表
根據基姆拉爾森計算公式,算法如下:
w = (day+2month+3(month-1)/5+year+year/4-year/100+year/400)%7;
解釋:公式中的日期中的日數,month表示日期中的月份數,year代表日期中的年份數
其中:公元元年爲參考,公元元年1月1日爲星期一,把1月和2月看成上一年的十三月和是四月
代碼如下:
#include <stdio.h>
#include <stdlib.h>
//判斷是否閏年
int leapyear(int year)
{
if((year % 4 ==0 && year % 100 !=0)||year %400 == 0)
{
return 1;
}
else
{
return 0;
}
}
int main(void)
{
int year,month;
printf("input year:");
scanf("%d",&year);
printf("input month:");
scanf("%d",&month);
if(month == 1||month == 2)
{
month += 12;
year--;
}
//每月的天數隨月份的不同而不同
int daycount = 0;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
case 13:
daycount = 31;
break;
case 4:
case 6:
case 9:
case 11:
daycount = 31;
break;
case 14:
{
if(leapyear(year))
{
daycount = 29;
}
else
{
daycount = 28;
}
break;
}
default:
break;
}
int blank = 0;
blank = (1+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;
if(month > 12)
{
month = month -12;
year++;
}
printf("-------------------%d,%d----------------\n",year,month);
printf("Mon\tTue\tWed\tThr\tFri\tSat\tSun\n");
int i = 0;
for(i = 0;i<blank;i++)
{
printf("\t");
}
for(i = 1;i<=daycount;i++)
{
printf("%d\t",i);
if((i+blank)%7 == 0)
{
printf("\n");
}
}
}
總結:分清楚每月的1號是星期幾即可。所以算法:
w = (day+2month+3(month-1)/5+year+year/4-year/100+year/400)%7;中的 day = 1.即可