在我们刷oj准备蓝桥杯时,代码在下面
我们遇见这样一个题目:输入一个日期 输出这个月的日历
如图所示:
我这个代码也是想了很久才写出来 被判断日期的事情逼疯了
相信很多人写这个代码遇见的问题主要就是如何判断每个月的第一天是星期几,题者我也找了很多公式 但是都觉得太过于麻烦,比如给定一个指定的日期,从那里循环计算得来,有一个公式是直接可以得出当前日期的,但是并不是首月,不过可以逆推回去,
week=((year-1)+((year-1)/4)-((year-1)/100)+((year-1)/400)+day-7);
//相信大家很迷糊为什么-7,其实我也不能很好解释 有意向的同学可以去看一下
//蔡勒公式,我也是-1然后发现bug 有些时候并不能直接表示,改来改去随便输
//入一个居然成功了 大家可以自己试试,可能有误 抱歉
a=week%7;//算星期几,0为特殊情况 也就是7;
if (a==0)
{
a=a+7;//防止为0
}
#include<stdio.h>
int main()
{
int year,month,das,week;//n年份 月份 日期 星期
int day=1;
int temp;//套用星期几的公式 总数
int i=1;
int a;
scanf("%d%d%d",&year,&month,&das);
if(month>12||day>31)
{
printf("瞎几把输入啥呢");
return 0;
}
for (i = 1; i < month; i++)
{
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
day+=31;//判断
else if (i==2)
{
if (year% 4 == 0 && year% 100 != 0 || year % 400 == 0)
day+=29;
else
day+=28;
}
else
day+=30;
}
week=((year-1)+((year-1)/4)-((year-1)/100)+((year-1)/400)+day-7);
a=week%7;//算星期几,0为特殊情况 也就是7;
if (a==0)
{
a=a+7;//防止为0
}
int end;//每个月的最后一天
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
end=31;
else if (month == 2)
{
if (year% 4 == 0 && year% 100 != 0 || year % 400 == 0)
end=29;
else
end=28;
}
else
end=30;
//printf("%d",day);
printf(" %d年%d月%d日是这一年的第%d天\n", year, month,das,day+das-1);//输出日历日历标题
printf(" 一 二 三 四 五 六 七\n");
for(int m=1;m<a;m++)
{
printf(" ");//a是星期几 空格堆过去;
}
for(i=1;i<=end;i++)
{
printf("%3d",i);
if((i+a-1)%7==0)//换行
{
printf("\n");
}
}
return 0;
}
代码就是这样了 谢谢各位 有不懂可以私信评论 谢谢大家