//控制台输入 年,月,动态显示 如下图的格式 //例如输入2020 9 //显示 // 一 二 三 四 五 六 日 // 1 2 3 4 5 6 //7 8 9 10 11 12 13 //..... //28 29 300 /** * 思路:1、根据年份计算是闰年还是平年,并计算这个月要打印多少天 * 2、计算1号前面需要打印多少个空格=当前 月 * 到1900年1月之前的所有天数对7取模的余数 * 3、打印空格和日期,并控制它的布局 */ public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print("请输入年份:"); int year=sc.nextInt(); System.out.print("请输入月份:"); int month=sc.nextInt(); //1、判断该年份是否为闰年 //2、计算从1900年到当前年份的月份一共多少天 int day=0; for (int i=1900;i<year;i++){ if (isRun(i)){ day+=366; }else { day+=365; } } for (int i=1;i<month;i++){ //获取指定月份的天数 int d=getDay(year,i); day+=d; } //3、计算空格数 int k=day%7; //4、计算这个月有多少天 int thisday=getDay(year,month); //5、输出 System.out.println("一\t二\t三\t四\t五\t六\t日"); //5.1 先输出空格数 for (int i=0;i<k;i++){ System.out.print(" \t"); } //5.2 输出天数 //由于 需要根据天数换行 n表示累计当前空格数和天数 是否需要换行 int n=k; for (int i=1;i<thisday;i++){ System.out.print(i+"\t"); n++; if (n%7==0){ System.out.println(); } } }
/** * 判断是否是闰年 * @param year 年份 * @return Boolean */ public static boolean isRun(int year){ if(year%4==0 && year%100!=0 || year%400==0){ return true; } return false; }
/** * 根据年份,月份判断这个月的天数 * @param year * @param month * @return */ public static int getDay(int year,int month){ int day=0; switch (month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: day+=31; break; case 4: case 6: case 9: case 11: day+=30; break; case 2: if (isRun(year)){ day+=29; }else { day+=28; } break; } return day; }