解题思路:
1:当year=2007时,怎么处理
2:如何处理2007<=n<=year-1的日期
3:当n来到year时,怎么处理;
4:如何处理闰年、平年;
5:如何处理二月
6:是否有规律
注意事项:
个人认为,此类题型的易错点往往在于2月份的处理,在解题时,我基本每次都是在这个地方处理不当而不通过
参考代码:(看注释进行解释)
//题目 1493: 蓝桥杯算法提高VIP-任意年月日历输出
#include<stdio.h>
int judge(int year)//判断闰年或平年
{
if((year%4==0&&year%100!=0)||year%400==0) return 1;
return 0;
}
int Sum1(int year,int date[]) //处理2007——year-1的日期
{
int sum=0;
for(int i=0;i<12;i++)
{
sum+=date[i];
}
if(!judge(year))//平年一整年下来比闰年少一天
{
sum-=1;
}
return sum;
}
int Sum2(int year,int month,int date[])//用于处理2007和year 年
{
int sum=0;
if(month==1)//处理月份时第一月的情况
{
sum=0;
}
else{
for(int i=0;i<month-1;i++)
{
sum+=date[i];
}
if(!judge(year)&&month!=2) sum-=1;//此处很细节(二月单独的处理)
}
return sum;
}
int main()
{
int year,month,i,sum=0;
int date[12]={31,29,31,30,31,30,31,31,30,31,30,31};
scanf("%d %d",&year,&month);
if(year>=2007)
{
if(year==2007)//单独处理2007年时的情况
{
sum=Sum2(year,month,date);
}
else{
for(i=2007;i<year;i++)//处理从2007到year-1年的情况
{
sum+=Sum1(i,date);
}
if(Sum2(year,month,date))
{
sum+=Sum2(year,month,date);
}
}
sum+=1;//以上得到的sum 是从2007 1开始到year month-1 的所有天数之和,加1跳到下一个月(即month)的第一天
int index=sum%7,flog=0;//余7处理用于和表头对上Su 1 ,Mo 2,Tu 3......,Sa 6;flog用于计数换行,满7置为0,并换行
printf("---------------------\n");
printf(" Su Mo Tu We Th Fr Sa\n");
printf("---------------------\n");
for(i=0;i<index;i++)//对第一行处理
{
if(i!=index)//第一行空的地方统一是3个空格
{
printf(" ");
flog++;
}
}
if(!judge(year))//此处对于2月的天数进行矫正(不然始终会是29天,当year是平年且month=2时打印的日历多一天)
{
date[1]--;
}
for(i=0;i<date[month-1];i++) //从1打印 到本月最大天数
{
printf("%3d",i+1);
flog++;
if(flog==7)
{
flog=0;
if(i!=date[month-1]-1)
{
printf("\n");
}
}
}
printf("\n---------------------");
}
return 0;
}
0.0分
0 人评分
简单的a+b (C++语言代码)浏览:895 |
字符串问题 (C语言代码)浏览:1634 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:693 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:387 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:732 |
1017题解浏览:663 |
图形输出 (C语言代码)浏览:1422 |
判定字符位置 (C语言代码)浏览:849 |
C语言程序设计教程(第三版)课后习题8.3 (C语言代码)浏览:620 |
数列问题 (C语言代码)浏览:1068 |