import java.util.Scanner;
public class MyCalendar {
/**
* 打印日历头
*/
public static void printTitle(){
System.out.println("星期日/t星期一/t星期二/t星期三/t星期四/t星期五/t星期六/t");
}
/**
* 判断year年的month月有几天
* @param year
* @param month
* @return
*/
public static int getDays(int year,int month){
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
default:
if(year%400==0 || year%4==0 && year%100!=0){
return 29;
}else{
return 28;
}
}
}
/**
* 判断year年month月的第一天是星期几
* 星期天 0
* 星期一 1
* ...
* 星期六 6
* @param year
* @param month
* @return
*/
public static int getWeekOfFirstDay(int year,int month){
//间隔的天数
int totalDays=0;
for (int i=1900;i<year;i++){
totalDays+=getYearDays(i);
}
for(int i=1;i<month;i++){
totalDays+=getDays(year,i);
}
return (totalDays+1)%7;
}
/**
* 判断该年有多少天
* @param year
* @return
*/
public static int getYearDays(int year){
if(year%400==0 || year%4==0 && year%100!=0){
return 366;
}else{
return 365;
}
}
public static void main(String[] args) {
//打印首行
System.out.println("************欢迎使用万年历************");
Scanner input=new Scanner(System.in);
System.out.print("/n请输入年:");
//确定年和月
int year=input.nextInt();
System.out.print("/n请输入月:");
int month=input.nextInt();
System.out.println("/n/n");
/**
* 打印日历
*
* 1. 打印日历头
* 2. 确定月的天数
* 2.1 确定闰年还是平年
* 2.2 确定大小月
* 3. 确定该月的第一天是星期几
* 3.1 使用7个数字分别表示星期几
* 星期天 0
* 星期一 1
* ...
* 星期六 6
*
* 3.2 分析出计算公式 (1+间隔天数)%7
* 3.2.1 计算间隔天数
* 比如计算 1900年 n月的的第一天是星期几 (前n-1个月天数+1)%7
* 比如计算 n年m月的的第一天是星期几 (前(n-1900)年的天数的总和 + n年前m-1个月天数+1)%7
*
* 4.开始打印
* 第一天是星期几就打印几个 '/t' 然后循环。这个月有几天,就循环多少次
*
*
*/
//打印日历头
printTitle();
//获取月的天数
int monthDays=getDays(year,month);
//第一天是星期几
int firstDay=getWeekOfFirstDay(year,month);
// 打印日历
printCalendar(monthDays,firstDay);
}
/**
* 打印日历
*/
public static void printCalendar(int monthDays,int firstDay){
for(int i=0;i<firstDay;i++){
System.out.print("/t");
}
for(int i=1;i<=monthDays;i++){
System.out.print(i+"/t");
if((i+firstDay)%7==0){
System.out.println();
}
}
}
}