zoukankan      html  css  js  c++  java
  • 【NOI OJ】18 打印月历

    24:打印月历


    总时间限制: 
    1000ms 
    内存限制: 
    65536kB
    描述

    给定年月,打印当月的月历表。

    输入
    输入为一行两个整数,第一个整数是年份year(1900 ≤ year ≤ 2099),第二个整数是月份month(1 ≤ month ≤ 12),中间用单个空格隔开。
    输出
    输出为月历表。月历表第一行为星期表头,如下所示:
    Sun Mon Tue Wed Thu Fri Sat
    其余各行一次是当月各天的日期,从1日开始到31日(30日或28日)。
    日期数字应于星期表头右对齐,即各位数与星期表头相应缩写的最后一个字母对齐。日期中间用空格分隔出空白。
    样例输入
    2006 5
    样例输出
    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
    提示
    闰年判断方法:能被4整除但不能被100整除,或者能被400整除。
    1900年1月1日是周一。

    #------------------------------------------------------------------------------#

    此题其实确定了每月的一号是周几后,打印起来不是很困难。

    首先来处理每月的一号是周几:
    它告诉我们1900年1月1日为周一,且数据不在1900年之前,所以就可以计算从1900年1月到输入的y年m月共有多少天,储存在k变量中,最后k%7就是星期几了。
    怎么计算?循环从1900年到y-1年,每次循环加上第i年的天数(无非就是366和365),最后加上一个循环从y年1月到m月,每次加上那个月的天数就行了。

    接下来要处理打印的问题了:
    第一:k是0-6,但是月历是从周天,周一,周二……到周六,所以0就代表周天,其他的就是一一对应了。
    然后就只有第一排要打印空格,空格数量就是k*4,接着要判断一行是否打完,用一个变量t,每打印一个t++,如果t+k==7,就代表一行打完,变打印一个换行,注意:每打一行t和k都要清零(其实后面k就没什么用了,但第一次一定要归零)

    就是这样了,附代码:

    #include<cstdio>
    int ps(int x,int y)
    {
    	if(y==2)
    		if((x%4==0&&x%100!=0)||(x%400==0))
    			return 29;
    		else
    			return 28;
    	else if(y==1||y==3||y==5||y==7||y==8||y==10||y==12)
    		return 31;
    	else
    		return 30;
    }//判断每月的天数
    int main()
    {
    	int m,y;
    	scanf("%d%d",&y,&m);
    	printf("Sun Mon Tue Wed Thu Fri Sat
    ");//打印月历的开头
    	int k=1;
    	for(int i=1900;i<y;i++)
    		if((i%4==0&&i%100!=0)||(i%400==0))
    			k+=366;
    		else
    			k+=365;
    	for(int j=1;j<m;j++)
    		k+=ps(y,j);
    	k=k%7;//计算第y年m月1号是周几
    	//printf("%d",k);//本来出了点问题,用这个来看看
    	int t=0,p=0;//两个临时变量
    	for(int i=1;i<=ps(y,m);i++)//循环到当月的最后一天
    	{
    		if(p==0)//用p来看是否已经打印过第一排才打印的空格
    		{
    			for(int j=0;j<k*4;j++)
    				printf(" ");//打印空格
    			p=1;
    		}
    		printf("%3d ",i);//控制格式并打印
    		t++;
    		if(t+k==7)//如果一排打印完了
    		{
    			printf("
    ");//打印换行
    			t=0;
    			k=0;//一定要清零
    		}
    	}
    	return 0;
    }

                                                                                                                              By WZY

  • 相关阅读:
    GeoServer与Spring MVC
    GeoServer二次开发1 hello Geoserver
    servlet的生命周期
    springboot打包出错,没有主清单
    空间数据库管理
    Gone with the wind
    谎言中的民众
    还是有些怀念这里啊
    MSN Protcol 学习笔记
    祝我的老师教师节快乐!
  • 原文地址:https://www.cnblogs.com/LinqiongTaoist/p/7203769.html
Copyright © 2011-2022 走看看