#include <stdio.h>
int fun(int y, int m);
int judge(int y, int m);
int main()
{
int year, month, i;
scanf("%d %d", &year, &month);
printf("---------------------\n\
Su Mo Tu We Th Fr Sa\n\
---------------------\n");
// 判断当前从周几开始打印
int start = fun(year, month);
// printf("%d\n", start);
int days = judge(year, month);
for (i = 1; i <= days + start; i++)
{
if (i <= start)
printf(" ");
else
printf("%3d", i - start);
if (i % 7 == 0)
printf("\n");
}
printf("\n---------------------\n");
}
int fun(int y, int m)
{
int sum = 0, i;
//先加本年到这个月为止之前的天数
for (i = 1; i < m; i++)
sum += judge(y, i);
for (i = 2007; i < y; i++)
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
sum += 366;
else
sum += 365;
return (sum + 1) % 7; //注意2007 1 1是星期一
}
//根据传入的年份和月份判断当前月有多少天
int judge(int y, int m)
{
if (m == 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0))
return 29;
else if (m == 2)
return 28;
else
switch (m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
break;
case 4:
case 6:
case 9:
case 11:
return 30;
break;
}
}
链接:[](https://blog.csdn.net/weixin_45761327/article/details/106922685)