弗莱


私信TA

用户名:1435075261

访问量:6636

签 名:

马梅,我还喜欢你,是不是有点可笑

等  级
排  名 1239
经  验 3060
参赛次数 0
文章发表 27
年  龄 0
在职情况 学生
学  校 野鸡大学
专  业

  自我简介:

解题思路:

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 人评分

  评论区

  • «
  • »