重点知识:如何计算一个月1号前的空格数
-----1900年到本月1号之前天数的总和,再处以七得到的余数就等于每个月1号前所空出来的天数.(1900年1月1号是星期1)
年分为闰年和平年,所以需要判断一下,(可以被4整除但不能被100整除||可以被400整除)闰年天数就是366天,否则就是平年365;闰月2月需要判断一下,闰月天数就是29天,否则就是28
----打印月历时,一行输出7个换行,即如果加上空格是七的倍数,则换行
输入样例:
输入一行,两个正整数,分别代表年份和月份。
2019 9
输出样例:
严格按样例格式输出一个月的日历。 第1行输出月份简称和年份,中间有个圆点和空格。 第2行输出表头,为星期一至星期日的缩写,每个单词之间一个空格。 第3行为28个减号。 接下来的几行是日历内容,每个日期输出时占3列,日期前后之间再加1个空格,保证与相对应的星期名称右对齐。
SEP. 2019
Mon Tue Wed Thu Fri Sat Sun
---------------------------
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
打印月历代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int y=sc.nextInt(),m=sc.nextInt();
int allday=0;
for(int i=1900;i<y;i++) allday += runyear(i)? 366 : 365;
System.out.println(allday);
for(int i=1;i<m;i++) allday += monyhday(i,y);
/*计算每个月1号前所空出来的天数*/
int ink=allday%7;
/*打印月历*/
System.out.println(monTH(m)+" "+y);
System.out.println("Mon Tue Wed Thu Fri Sat Sun");
System.out.println("---------------------------");
/*空格打印1号前的天数*/
for(int i=0;i<ink;i++){
if(i>0) System.out.print(" ");
System.out.print(" ");
}
int day=monyhday(m,y);
for(int i=1;i<=day;i++){
/*两个日期间有空格*/
if((i+ink)%7!=1) System.out.print(" ");
System.out.printf("%3d",i);
/*加上空格是七的倍数,则换行*/
if((i+ink)%7==0)System.out.println();
}
}
/*判断是否为闰年*/
public static boolean runyear(int k){
return k%400==0||(k%4==0&&k%100!=0);
}
/*返回每月的天数*/
public static int monyhday(int i,int year)
{
if(i==1||i==3||i==5||i==7||i==8||i==10||1==12) return 31;
else if(i==2) return runyear(year)?29:28;
else return 30;
}
/*返回月份缩写*/
public static String monTH(int k){
String s="";
switch (k){
case 1:s="JAN.";break;
case 2:s="FEB.";break;
case 3:s="MAR.";break;
case 4:s="APR.";break;
case 5:s="MAY.";break;
case 6:s="JUN.";break;
case 7:s="JUL.";break;
case 8:s="AUG.";break;
case 9:s="SEP.";break;
case 10:s= "OCT.";break;
case 11:s= "NOV.";break;
case 12:s= "DEC.";break;
}
return s;
}
}