java实现万年历的打印(通过控制台输出)
- 原理:
- 判断闰年方法: 一个年份能被4整除并且不能被100整除 或者 能被400整除,满足这个条件的就是闰年。闰年一年有366天,不是闰年则是365天
- 月份的大小月:1,3,5,7,8,10,12月为大月,每月有31天。而4,6,9,11为小月,每月有30天。而2月分为闰年和平常年,2月闰年有29天,2月是平常年则有28天
- 整体思路: 因为1900年1月1日是从周一开始的,我们可以通过计算输入的年月和1900年比较,相差多少天,再根据这个天数进行日历的后续整除7,取得余数,进行判断,将日历在控制台打印出来
- 代码实现:
import java.util.Scanner;
public class CalendarTest {
public static void main(String[] args) {
//获得年月的相关值,通过键盘输入整数代表年月
Scanner sc = new Scanner(System.in);
System.out.println("输入你要要查询的日历年");
int year = sc.nextInt();
System.out.println("输入你要要查询的日历月");
int month = sc.nextInt();
//输出日历的基本格式,星期
System.out.println("一\t二\t三\t四\t五\t六\t日");
//以1900一月一日为开始,计算输入的年月据它的天数,1900年1月1日为星期一
int days = 0;
int sum = 0;
//计算该月份有多少天
//1,3,5,7,8,10,12为大月,有31天,而4,6,9,11月为小月,有30天
//2月再闰年有29天,平年28天
if(month == 1 ||month == 3 ||month == 5 ||month == 7 ||month == 8 ||month == 10 ||month == 12){
days = 31;
}else if(month == 2){
//判断闰年方法:
//能被4整除和不能被100整除 或者 能被400整除 的为闰年
if(year%4 == 0 && year%100 !=0 || year % 400 == 0){
days = 29;
}else{
days = 28;
}
}else{
days = 30;
}
//判断输入年份跟1900年有多少天
for(int i = 1900;i < year;i++){
//判断日否闰年,i代表年份
if(i%4 == 0 && i%100 !=0 || i % 400 == 0){
sum += 366;
}else{
sum += 365;
}
}
//再根据月份来加上月份的天数
for(int j = 1;j < month;j++){
//判断大小月,二月的天数,j代表月份
if(j == 1 ||j == 3 ||j == 5 ||j == 7 ||j == 8 ||j == 10 ||j == 12){
//大月
sum += 31;
}else if(j == 2){
//判断闰年方法:
//能被4整除和不能被100整除 或者 能被400整除 的为闰年
if(year%4 == 0 && year%100 !=0 || year % 400 == 0){
sum += 29;
}else{
sum += 28;
}
}else{
//小月
sum += 30;
}
}
//在控制台上输出日历
//由于第一行存在空格,space存储要打印的空格数,这是因为1号不一定从星期1开始
int space = sum % 7;
//三元运算符,看天数的余数是否为0,为0,则从星期一开始打印1号,否则就打印它的余数位空白后,进行1号打印
space = space == 0 ? 0 : space;
for(int i = 1 ; i <= days + space ;i++){
//开是否有余数,决定1号在星期几开始
if(i <= space){
System.out.print("\t");
}else{
System.out.print((i-space) + (i%7==0 ?"\n":"\t"));
}
}
}
}
- 结果:
