题目 1493: 任意年月日历输出

题目

已知2007年1月1日为星期一。
设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印。
为完成此函数,设计必要的辅助函数可能也是必要的。其中输入为年分和月份。

注意:短线“-”个数要与题目中一致,否则系统会判为错误。

输入
年月和月份

输出

样例输入

2010 9 

样例输出

---------------------
 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 30
---------------------

解题思路

先计算出2007年的1月1日到输入月份的首日有多少天,并对7取模,得出的数值即为距离星期一差几天,再根据规律进行输出既可以。

易错点

  1. 第一行的输出:如果恰好待输出的月份的1号也是星期一,那么第一行不需要输出任何空格、数字、也不需要换行(83分时修正,但不在测试点范围内);
  2. 闰年的定义:能被4整除,但是不能被100整除(测试用例:2100 2,改好了这里83变为了正确);
  3. 2007年1月1日距离2007年2月1日相差的是31天,最终某天的周几 = 相差天数%7+1(比如2007年2月1日是周二)。

代码

//已知2007年1月1日为星期一
//即2006年的12月31日为星期日
#include<stdio.h>
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
//int space[7] = {0,1,2,3,4,5,6};
void Print(int y, int m){
    int i,j,d = month[m];
    int days = 0;
    if (m==2 && y%100!=0 && y%4==0)//确定要显示的天数
        d++;
    for (i=2007;i<=y;i++)//计算相隔多少天
    {
        if (i!=y)
        {
            days+=(365%7);
            if (i%100!=0 && i%4==0)//闰年,366天
                days++;
        }
        else
        {
            for (j=1;j<m;j++)
            {
                days+=(month[j]%7);
                if (j==2 && y%4==0 && y%100!=0)//闰年2月多一天
                    days++;
            }
        }
    }
    days%=7;
    //第一行
    if (days!=6)
    {
        for (i=0;i<=days;i++)
            printf("   ");
    }
    for (i=1;i<(7-days);i++)
    {
        printf("%3d",i);
        if (i==(6-days))
            printf("\n");
    }
    
    //之后的行
    for (i;i<=d;i++)
    {
        printf("%3d",i);
        if (i!=d && (i+days+1)%7==0)
            printf("\n");
    }
}

int main()
{
    int y,m;
    scanf("%d %d",&y,&m);
    if (y>=2007)//2007年以前的拒绝打印
    {
	    printf("---------------------\n");
	    printf(" Su Mo Tu We Th Fr Sa\n");
	    printf("---------------------\n");
	    Print(y,m);
	    printf("\n---------------------");
    }
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值