package wannianli;
public class demo2 {
/*
* 已知2000-1-1星期六
* 求某年的挂历
* 解题思路:
* 1,判断某年是否为闰年
* 2,某年某月有多少天
* 3,某年有多少天
* 4,某年某月当月第一天是星期几
* 5,某年某月到2000年1月1日有多少天
* 6,
* */
static boolean isyear(int year){
boolean isk=false;
isk=year%4==0&&year%100!=0||year%400==0 ? true:false;
return isk;
}
//某年的总天数
static int yearzongdays(int year){
int yearzong=0;
yearzong=isyear(year) ? 366:365;
return yearzong;
}
//某年每月是多少天
static int yearmonthdays(int year,int month){
int ym=0;
switch (month) {
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
ym=31;
break;
case 4:case 6:case 9:case 11:
ym=30;
break;
case 2:
ym=isyear(year) ? 29:28;
break;
default:
ym=0;
break;
}
return ym;
}
//从某年开始距2000—01-01多少天
static int to20000101days (int year,int month){
int days=0;
if (year>=2000){
for(int y=2000;y<year;y++){
days=days+yearzongdays(y);
}
for(int m=1;m<13;m++){
days=days+yearmonthdays(year, m);
}
}else {
for(int y=year+1;y<2000;y++){
days=days+yearzongdays(y);
}
for(int m=1;m<13;m++){
days=days+yearmonthdays(year, m);
}
}
return days;
}
//某年某月一号是星期几
/*
* 5.某年某月的1号星期几
* 0123456
* 日一二三四五六
* a.2003-5-1
* (6+n)%7 推导出来的判断第一天是周几的公式如果大于2000年使用第一中反之
* b.1997-5-1
* 6-n%7
*/
static int weekdays(int year,int month){
int weekdays=0;
int n=to20000101days(year, month);
if (year>=2000) {
weekdays=(6+n)%7;
}else {
weekdays=6-n%7;
}
return weekdays;
}
//打印
static void display(int year,int month){
System.out.println("----"+year+"年"+month+"-----");
System.out.println("日\t一\t二\t三\t四\t五\t六\t周");
int days=yearmonthdays(year, month);
int week=weekdays(year, month);
int count =0;
for(int i = 0;i<week;i++){
System.out.print("\t");
count++;
}
for(int x=1;x<=days;x++){
System.out.print(x+"\t");
count++;
if (count%7==0) {
System.out.println();
}
}
}
//打印某年的日历
static void quandisplay(int year){
for(int m=1;m<13;m++){
display(year, m);
System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
quandisplay(2018);
}
}