Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
Input 一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。Output T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。Sample Input
1
1988-03-07Sample Output 6574
Input 一个数T,后面T行每行有一个日期,格式是YYYY-MM-DD。如我的生日是1988-03-07。Output T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。Sample Input
1
1988-03-07Sample Output 6574
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class BirthdayEighteen{ public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
for(int i=1;i<=n;i++){
String beginDate=scanner.next();
int year=Integer.parseInt(beginDate.substring(0, 4));
if((year%4==0&&year%100!=0)||year%400==0){//是不是闰年的2月29号,没十八岁生日
if(beginDate.substring(5, 10).equals("02-29"))
{System.out.println(-1);break;}
}
String t=String.valueOf(year+18);
String endDate=beginDate.replaceAll(beginDate.substring(0, 4), t);
try {
Date d1 = sim.parse(beginDate);
Date d2 = sim.parse(endDate);
long a=d2.getTime()-d1.getTime();
long day=a/(3600L * 1000 * 24);//求天数
System.out.println(day);
} catch (ParseException e) {
e.printStackTrace();
} } }}
连接:http://acm.hdu.edu.cn/showproblem.php?pid=1201
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class BirthdayEighteen{public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
for(int i=1;i<=n;i++){
String beginDate=scanner.next();
int year=Integer.parseInt(beginDate.substring(0, 4));
if((year%4==0&&year%100!=0)||year%400==0){//是不是闰年的2月29号,没十八岁生日
if(beginDate.substring(5, 10).equals("02-29"))
{System.out.println(-1);break;}
}
String t=String.valueOf(year+18);
String endDate=beginDate.replaceAll(beginDate.substring(0, 4), t);
try {
Date d1 = sim.parse(beginDate);
Date d2 = sim.parse(endDate);
long a=d2.getTime()-d1.getTime();
long day=a/(3600L * 1000 * 24);//求天数
System.out.println(day);
} catch (ParseException e) {
e.printStackTrace();
}}}}
import java.util.Calendar;
import java.util.GregorianCalendar;public class Birthday {
public static long getDays(Calendar birthday){
//新建日期对象,存储18年后的这一天
Calendar now = new GregorianCalendar();
now.set(Calendar.YEAR, birthday.get(Calendar.YEAR)+18);
now.set(Calendar.MONTH, birthday.get(Calendar.MONTH));
now.set(Calendar.DAY_OF_MONTH, birthday.get(Calendar.DAY_OF_MONTH));
//如果这一天和birthday不是同一个月,即当年没有生日
if(now.get(Calendar.MONTH)!=birthday.get(Calendar.MONTH)){
return -1L;
}
//两个时间转成毫秒数然后计算出天数
long time = now.getTimeInMillis()-birthday.getTimeInMillis();
long days = time/(1000*3600*24);
return days;
}
public static void main(String[] args) {
Calendar birthday = new GregorianCalendar(1987,2,28);
System.out.println(getDays(birthday));
}
}
而实际上2月没有29号,所以会自动转换成1987年3月1日
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class BirthdayEighteen{public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
for(int i=1;i<=n;i++){
String beginDate=scanner.next();
int year=Integer.parseInt(beginDate.substring(0, 4));
if((year%4==0&&year%100!=0)||year%400==0){//是不是闰年的2月29号,没十八岁生日
if(beginDate.substring(5, 10).equals("02-29"))
{System.out.println(-1);break;}
}
String t=String.valueOf(year+18);
String endDate=beginDate.replaceAll(beginDate.substring(0, 4), t);
try {
Date d1 = sim.parse(beginDate);
Date d2 = sim.parse(endDate);
long a=d2.getTime()-d1.getTime();
long day=a/(3600L * 1000 * 24);//求天数
System.out.println(day);
} catch (ParseException e) {
e.printStackTrace();
}}}}
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;public class bir18 { public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 1; i <= n; i++) {
String beginDate = scanner.next();
int year = Integer.parseInt(beginDate.substring(0, 4));
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//是不是闰年的
if (beginDate.substring(5, 10).equals("02-29")) {//2月29号,没十八岁生日
System.out.println(-1);
break;
}
}
String t = String.valueOf(year + 18);
String endDate = beginDate.replaceAll(beginDate.substring(0, 4), t);
try {
Date d1 = sim.parse(beginDate);
Date d2 = sim.parse(endDate);
long a = d2.getTime() - d1.getTime();
long day = a / (3600L * 1000 * 24);//求天数
System.out.println(day);
} catch (ParseException e) {
e.printStackTrace();
} } }
}总是wrong answer啊
我也去做做
你也用java做acm,同行,呵呵,交个朋友
/*
* 判断是否为闰年
*/
public static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
} /**
* 计算18周岁的天数
* @param bYear 出生年份
* @param bMonth 出生月份
* @param bDay 出生日数
*/
public static int getDays(int bYear, int bMonth, int bDay) {
// 如果是闰年2月29生日,无18岁生日
if (bMonth == 2 && bDay == 29)
return -1;
// 如果是闰年,且是2月29前生日,则从当年开始算.否则从次年开始算
int startYear = bYear;
int endYear = bYear + 18 - 1;
if (!isLeapYear(bYear) || bMonth > 2) {
startYear++;
endYear++;
}
// 计算第一个可能是闰年的年份
if (startYear % 4 != 0) {
startYear = startYear / 4 * 4 + 4;
}
// 如果不考虑100倍数的特殊情况,从startYear至endYear,包含(endYear-startYear)/4+1个闰年.
int days = 365 * 18 + (endYear - startYear) / 4 + 1;
// 计算endYear前的可以被100整除的年份,即世纪年。比如2000,1900等
int centuryYear = endYear / 100 * 100;
// 如果世纪年在计算日期之间,且不能被400整除,天数-1
if (centuryYear >= startYear && centuryYear % 400 != 0)
days--;
//以下为测试输出代码
System.out.println(bYear + "-" + bMonth + "-" + bDay + "至" + (bYear + 18) + "-" + bMonth + "-" + bDay + "\t共计" + days + "天");
for (int year = startYear; year <= endYear; year += 4)
if (year % 100 != 0 || year % 400 == 0)
System.out.println(year + " 闰年");
//测试输入代码End
return days;
}
getDays(1980, 2, 29);
getDays(1980, 2, 28);
getDays(1980, 3, 1);
getDays(1981, 3, 1);
getDays(1982, 3, 1);
getDays(1983, 3, 1);
getDays(1984, 3, 1);
getDays(1884, 3, 1);
测试输出结果
1980-2-28至1998-2-28 共计6575天
1980 闰年
1984 闰年
1988 闰年
1992 闰年
1996 闰年
1980-3-1至1998-3-1 共计6574天
1984 闰年
1988 闰年
1992 闰年
1996 闰年
1981-3-1至1999-3-1 共计6574天
1984 闰年
1988 闰年
1992 闰年
1996 闰年
1982-3-1至2000-3-1 共计6575天
1984 闰年
1988 闰年
1992 闰年
1996 闰年
2000 闰年
1983-3-1至2001-3-1 共计6575天
1984 闰年
1988 闰年
1992 闰年
1996 闰年
2000 闰年
1984-3-1至2002-3-1 共计6574天
1988 闰年
1992 闰年
1996 闰年
2000 闰年
1884-3-1至1902-3-1 共计6573天
1888 闰年
1892 闰年
1896 闰年ps:注意最后一个测试例子
1900年不是闰年
1992 闰年
1996 闰年
2000 闰年
2004 闰年