1032. 小强的生日

1032. 小强的生日

单点时限: 2.0 sec

内存限制: 256 MB

小强出生于 2008 年 2 月 29 日。与别的小朋友不一样,小强要隔四年才能过一次生日 L。小强很想知道自己什么时侯才能过生日,因此想请你编写一个程序显示 2 月份的日历给他看,以方便他确定自己的生日。

2008 年 2 月的日历如下:

SU MO TU WE TH FR SA
1  2
3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

请按照此格式输出指定年份 2 月的日历。

输入格式

输入一行范围为 [2008,2100] 内的整数,每个整数以一个空格分隔。

输出格式

输出每个整数对应年的 2 月份的日历。每个日历之后输出一个空行(包括最后一个),日历数字之间以一个空格分隔,但是结尾不能有空格,一列数字右对齐,左边用空格补齐。如以 _ 表示空格,一个典型的输出格式为:

_SU_MO_TU_WE_TH_FR_SA
_________________1__2
__3__4__5__6__7__8__9
_10_11_12_13_14_15_16
_17_18_19_20_21_22_23
_24_25_26_27_28_29

样例

Input

2008 2009 2010

Output

 SU MO TU WE TH FR SA
                 1  2
  3  4  5  6  7  8  9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29

 SU MO TU WE TH FR SA
  1  2  3  4  5  6  7
  8  9 10 11 12 13 14
 15 16 17 18 19 20 21
 22 23 24 25 26 27 28

 SU MO TU WE TH FR SA
     1  2  3  4  5  6
  7  8  9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//统计2008到x-1年的闰年个数
int is_year_sum(int x){
    int sum=0;
    for(int i=2008;i<x;i++){
        if((i%4==0&&i%100!=0) || i%400==0)sum++;
    }
    return sum;
}
int is_year(int x){
    if((x%4==0&&x%100!=0) || x%400==0)return 1;
    return 0;
}
int main()
{
    int year;
    int space=5;//从2008年日历开始2月1号前面的空缺,当年为闰年,下一年后移2个,否则移动一个
    while(scanf("%d",&year)==1){
        printf(" SU MO TU WE TH FR SA\n");
        int num=is_year_sum(year);
        int backnum=(5+num*2+(year-2008-num) )%7;
        for(int i=0;i<backnum;i++){
            printf("   ");
        }
        int date=1;
        for(int j=backnum+1;j<=7;j++){
            printf("%3d",date);
            date++;
        }
        printf("\n");//第一行
        int count=0;
        for(int k=date;k<29;k++){
                printf("%3d",date);
                date++;
                count++;
                if(count%7==0&&k!=28)printf("\n");
        }
        if(is_year(year)&&count%7==0){
                printf("\n 29\n");
        }else if(is_year(year)&&count%7!=0){
            printf(" 29\n");
        }
        else printf("\n");
        printf("\n");
    }//最后这里格式对齐比较复杂
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值