目录
闰年的判定方法
1.一般规律
四年一闰,百年不闰,四百年再闰(查自百度百科)
核心代码:
public static boolean isLeapyear(int year){
return year%4==0&&year%100!=0||year%400==0;
}
这个方法也是有弊端的,在年份过大的时候,就不再适用
2.数据量大时(推荐)
四年一闰,百年不闰,四百年再闰,三千二百年不闰
核心代码:
public static boolean isLeapyear(int year){
return year%4==0&&year%100!=0||year%400==0&&year%3200!=0;
}
练习题:
1.
题目:
/* 一组案例,输入三个整数,分别表示年月日,输出三天后的年月日,年月日之间有空格,日后没空格,不换行 */
思路:
/* 思路: 先开一个数组,来保存每月对应的总天数(闰年的每月天数) 判断是否为闰年,不是闰年将二月改为28,因为本题不涉及多组案例,所以如果是闰年,那么就是数组中的29 先判断这天+3之后还是否在本月,如在本月则直接进行day+3 如果day+3后超过本月总天数,但本月+1并未超过本年,则month+1,day=3-(lyday[month]-day) 如果day+3之后不但超过本月总天数,而且本月+1还超过了12,则year+1,month变为1,day=3-(lyday[month]-day) */
代码:
package 闰年类;
import java.io.*;
public class Main {
static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int[] lyday = {0,31,29,31,30,31,30,31,31,30,31,30,31};
public static boolean isLeapyear(int year){
return year%4==0&&year%100!=0||year%400==0&&year%3200!=0;
}
public static void before(int year,int month,int day){
if (day+3<=lyday[month]) {
output.print(year + " " + month + " " + (day + 3));
output.flush();
}
else {
if (month+1<=12) {
output.print(year + " " + (month + 1) + " " + (3 - (lyday[month] - day)));
output.flush();
}
else {
output.print((year + 1) + " " + 1 + " " + (3 - (lyday[month] - day)));
output.flush();
}
}
}
public static void main(String[] args) throws IOException
input.nextToken();int year = (int)input.nval;
input.nextToken();int month = (int)input.nval;
input.nextToken();int day = (int)input.nval;
if (isLeapyear(year)){
before(year,month,day);
}else {
lyday[2] = 28;
before(year,month,day);
}
}
}
2.
题目:
/* 输入年月日,输出该天是在所在年的第几天 */
思路:
/* 思路: 先开辟一个数组保存每个月的天数(以闰年为例) 判断输入的年份是否为闰年, 如是闰年 将输入月份的前驱月份到1月的对应天数进行累加,最后再加上day 否则 将数组的29改为28,再进行天数相加 */
代码:
package 闰年类;
import java.io.*;
public class Main {
static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static boolean isLaepyear(int year){
return year%4==0&&year%100!=0||year%400==0&&year%3200!=0;
}
public static void main(String[] args) throws IOException{
int[] lyday = {0,31,29,31,30,31,30,31,31,30,31,30,31};
/*
之所以数组第一个数字为0,是因为:
数组的遍历,它的索引值是从0开始的,而月份是从1开始,数组保存一个0之后,
那么我们在进行数组遍历的时候就不需要再考虑月份与索引值对不上的问题了,
如果不保存0,那么月份对应的索引值就是:月份-1
*/
input.nextToken();
int t = (int)input.nval;
while (t-->0){
input.nextToken();int year = (int)input.nval;
input.nextToken();int month = (int)input.nval;
input.nextToken();int day = (int)input.nval;
int sum = 0;//sum为在这一年一共多少天
if (isLaepyear(year)){//是闰年
lyday[2]=29;
/*
让闰年的2月总天数一直保持在29,这步操作的原因是:
因为是多组数据,如果上一个数据的年份不是闰年,2月的天数会被我们改成28,
那么我们进行下次数据的输入时:如果当前年份为闰年,但此时我们数组保存的2月天数已不是29,
因此我们需要将28改为29
*/
for (int i = 1; i < month; i++) {
sum+=lyday[i];
}
sum+=day;
}else {//不是闰年
lyday[2]=28;//将29改为28
for (int i = 1; i < month; i++) {
sum+=lyday[i];
}
sum+=day;
}
output.println(sum);
output.flush();
}
output.close();
}
}
3.
题目:
/* 题目: 已知某人的出生日期,以及表示今天的某个日期,问某人今天的年龄。 按照周岁年龄,也就是说出生时算0岁,下一年的生日那天开始算1岁,再下一年生日那天开始算2岁,以此类推。 如果生日是2月29日,那么非闰年的年份生日按2月28日算。 输入: 两行,第一行的三个整数表示出生日期中的年、月、日 第二行的三个整数表示今天的年、月、日 保证都是合法日期 输出: 一个整数,表示某人今天的年龄。 不要换行。 */
思路:
/* 解题思路: 只考虑特殊情况,如果生日为闰年的2月29日,而之后过的生日当天并不是闰年,而是平年的2月28日, 那么我们将2月28日变为2月29日,来方便我们判断 */
代码:
package 闰年类;
import java.io.*;
/*
因为我用的输入输出是StreamTokenizer分词器与PrintWriter加缓冲流,所以我的导包并不是import java.util.Scanner;
用这样的输入输出的原因是:能够减少运行时间(数据量大的时候)
*/
public class Main {
static StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
public static boolean isLeapyear(int year){
return year%4==0&&year%100!=0||year%400==0&&year%3200!=0;
}
public static void main(String[] args) throws IOException{
input.nextToken();int year1 = (int)input.nval;
input.nextToken();int month1 = (int)input.nval;
input.nextToken();int day1 = (int)input.nval;
input.nextToken();int year2 = (int)input.nval;
input.nextToken();int month2 = (int)input.nval;
input.nextToken();int day2 = (int)input.nval;
if (month1==2&&day1==29&&!isLeapyear(year2)&&month2==2&&day2==28)
day2=29;
/*
如果生日是2月29日,但今年不是闰年,并且是2月28日,我们将非闰年的2月28日看作是闰年的2月29日
*/
/*
注意:当天生日就会增加,不是生日的下一天才开始加!!!
*/
if (month2>month1||month1==month2&&day2>=day1)
output.print(year2-year1);
else output.print(year2-year1-1);
output.flush();
output.close();
}
}