思路:
先注意区分每年有31天的月份(1月,3月,5月,7月,8月,10月,12月)和有30天的月份(4月,6月,9月,11月),判断平闰年得到2月的天数。再判断输入的年份距离1900年的整年天数差,判断输入的月份距离该年1月的整月天数差,最后判断每个月的1号是周几。最后打印输出万年历。
代码:
public static void main(String[] args) {
//1.第一阶段,准备阶段
Scanner input=new Scanner(System.in);
System.out.println("请输入4位的年份");
int year=input.nextInt();
System.out.println("请输入月份:");
int month=input.nextInt();
System.out.println(year+"年"+month+"月\t\t\t\t\t< >");
//2.根据输入的月份获得该月份对应的天数
int monthdays=0;
if (month==1 ||month==3 ||month==5 ||month==7 ||month==8 ||month==10 || month==12){
monthdays=31;
}else if (month==4 ||month==6 ||month==9 ||month==11){
monthdays=30;
}else {
if ((year%4==0 && year%100!=0) || year%400==0){
monthdays=29;
}else {
monthdays=28;
}
}
//3.求输入的月份的1号是周几
//(3.1)求输入年份 距离1900年的整年天数差是多少天?
int sumYear=0;
for (int i=1900;i<year;i++){
if(i%4==0 && i%100!=0 ||i%400==0){
sumYear=sumYear+366;
}else{
sumYear=sumYear+365;
}
}
//(3.2)求输入月份 距离输入年份的1月的整月天数差
int sumMonth=0;
for(int i=1;i<month;i++){
if(i==1|| i==3 ||i==5 ||i==7 ||i==8 ||i==10 ||i==12){
sumMonth=sumMonth+31;//简化 sumMonth+=31;
}else if(i==4|| i==6 ||i==9 ||i==11 ){
sumMonth=sumMonth+30;
}else{
if(year%4==0 && year%100!=0 || year%400==0){
sumMonth=sumMonth+29;
}else{
sumMonth=sumMonth+28;
}
}
}
//(3.3) 求 输入年输入月的1号是周几?
int week=(sumYear+sumMonth+1)%7;
//System.out.println(year+"年"+month+"月1号是周"+week);
//4.打印日历:
System.out.println("一\t二\t三\t四\t五\t六\t日");
//打印空格:
for(int i=1;i<=week-1;i++){
System.out.print("\t");
}
//打印日历
for(int i=1;i<=monthdays;i++){
System.out.print(i+"\t");
if((sumYear+sumMonth+i)%7==0){
System.out.println();
}
}
}
运行结果:
总结:
编码万年历时一定要注意区分月份的天数,尤其是2月的天数,需要知道如何计算2月的天数,不然很容易出错。在编译 年 月 日时,先编译年份,再编译月份,最后需要判断每月1号是周几,这个是容易忽视的点,一定要进行判断。最后输出万年历,查看运行结果是否正确。