公元万年历

题目来源:http://116.56.140.75:8000/JudgeOnline/problem.php?id=1712

1712: 公历万年历

时间限制: 1 Sec 内存限制: 64 MB

题目描述

日历在于我们的日常生活中安排工作、活动等场合经常要用到。在Windows操作系统中也自带有此功能。双击任务栏中时间或者从“开始→控制面板→时间日期"打开时间日期属性窗口。

Windows XP中如下图:

Windows 7中如下图:

你可以先体验一下它的万年历功能。你也可以编一个公历的万年历,试试看,其实也不难啦,关键是要细心,要充分测试。

输入

第一个正整数表示测试用例的个数。对于每一个测试用例,给定年份和月份都是正整数。每个给定的年月都是公元后。

输出

对每个测试用例分别请按照示例输出当前月份的日历信息。其中每列占用4个字符位置,不足4个字符的用空格补齐,并且向左对齐。每个测试用例之间用一个空行隔开。周日至周五分别用英文的前3个字母表示,即Sun,Mon,Tue,Wed,Thu,Fri,Sat

样例输入

3
1981 2
1986 2
2009 12

样例输出

year:1981 month:2
Sun Mon Tue Wed Thu Fri Sat
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  

year:1986 month:2
Sun Mon Tue Wed Thu Fri Sat
                        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  

year:2009 month:12
Sun Mon Tue Wed Thu Fri Sat
        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  30  31  

提示

注意空格的多少的使用!

解析:就是对日期的处理咯,还有注意空格的使用

代码:

#include<iostream>  
#include<iomanip> 
using namespace std; 
bool check(int y)  
{ 
    if (y % 100 == 0) 
    { 
        if (y % 400 == 0) 
            return 1; 
        else
            return 0; 
    } 
    else
    { 
        if (y % 4 == 0) 
            return 1; 
        else
            return 0; 
    } 
} 
int main()  
{ 
    int mon[20] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; 
    int t; 
    cin >> t; 
    int y, m; 
    while (t--) 
    { 
        cin >> y >> m; 
        cout << "year:" << y << " month:" << m << endl; 
        cout << "Sun Mon Tue Wed Thu Fri Sat\n"; 
        if (check(y)) 
            mon[2] = 29; 
        int sum = 0; 
        for (int i = 1; i<y; i++) 
        { 
            if (check(i)) 
                sum += 366; 
            else
                sum += 365; 
        } 
        for (int i = 1; i<m; i++) 
            sum += mon[i]; 
        sum += 1; 
        int flag = sum % 7, sum1 = 0; 
        switch (flag) 
        {  
        case 0:  
            cout << "1   "; 
            sum1 = 1;  
            break; 
        case 1: 
            cout << "    1   "; 
            sum1 = 2;  
            break; 
        case 2: 
            cout << "        1   "; 
            sum1 = 3;  
            break; 
        case 3: 
            cout << "            1   "; 
            sum1 = 4; 
            break; 
        case 4: 
            cout << "                1   "; 
            sum1 = 5;  
            break; 
        case 5: 
            cout << "                    1   "; 
            sum1 = 6; 
            break; 
        case 6: 
            cout << "                        1   "; 
            sum1 = 7;  
            break; 
        }  
        for (int k = 2; k <= mon[m]; k++) 
        { 
            if (sum1 % 7 == 0) 
                cout << endl; 
            sum1++; 
            cout << left << setw(4) << k; 
        } 
        cout << "\n\n"; 
    } 
    return 0; 
} 
/************************************************************** 
    Problem: 1712 
    User: 201730685257 
    Language: C++ 
    Result: 正确 
    Time:0 ms 
    Memory:1484 kb 
****************************************************************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值