ccf节日

来源:互联网 发布:手机视频捕捉软件 编辑:程序博客网 时间:2024/05/01 02:34

这道题思路感觉不是太难,主要是在实现过程中如何减少代码重复的片段,我后来看了网上的一些代码,长的有两百多行,有的思路也比较拧巴,在这里记录一下我的解法:

package CCF;import java.util.Scanner;public class Date {public static void main(String args[]){Scanner scan=new Scanner(System.in);int month=scan.nextInt();int num=scan.nextInt();int day=scan.nextInt();int year1=scan.nextInt();int year2=scan.nextInt();int []days={0,31,28,31,30,31,30,31,31,30,31,30,31};int []week={2,3,4,5,6,7,1};for(int i=year1;i<=year2;i++){int sum=0;days[2]=28;//计算从1850年1月1日到year年1月1日总共有多少天for(int j=1850;j<i;j++){if(isLeep(j))sum+=366;elsesum+=365;}//计算从year年1月1日到year年month-1月的最后一天有多少天if(isLeep(i)){days[2]=29;for(int j=1;j<month;j++){sum+=days[j];}}else{for(int j=1;j<month;j++){sum+=days[j];}}//计算year年month月1日是星期几int xingqi=((sum-1)%7+2)%7;    //实际计算的是month-1月最后一天星期几int m=1;xingqi++;if(xingqi<=day){m+=(num-1)*7+(day-xingqi);}else{m+=num*7+day-xingqi;}if(m>days[month]){System.out.println("none");}else{if(month<10){if(m<10){System.out.println(i+"/"+"0"+month+"/"+"0"+m);}else{System.out.println(i+"/"+"0"+month+"/"+m);}}else{System.out.println(i+"/"+month+"/"+m);}}}}public static boolean isLeep(int year){if(year%4==0&&year%100!=0||year%400==0)return true;elsereturn false;}}

我觉得整个代码比较复杂的部分在这里

//计算year年month月1日是星期几int xingqi=((sum-1)%7+2)%7;    //实际计算的是month-1月最后一天星期几int m=1;xingqi++;

弄清楚这一步,首先要知道余数和星期之间有这样的对应关系:

余数:0 1 2 3 4 5 6

星期:2 3 4 5 6 7 1

也就是说余数与星期之间的关系是:(余数+2)%7=星期

为什么要先计算month月1日的前一天呢?设想一下如果直接计算1日,如果余数恰好为5,则根据上面算式会得出那天是星期零,所以很明显是错误的,因此先计算前一天,就算前一天算出来是星期零,但加1之后1号是星期一所以不会有任何问题。

还有sum为什么要-1?我们已知1850年1月1日星期2,sum包括了这一天,只有减去这一天才是month-1月的最后一天与1850年1月1日的真正的差值,用这个差值对7取余才算正确。

原创粉丝点击