第几天
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:1701 测试通过:483
方法二:使用java提供的函数
总提交:1701 测试通过:483
描述
在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。
给定公元2000年1月1日后的某年某月某日(包括2000年1月1日),你的任务:(1)给出这一天从公元2000年1月1日开始逝去的天数,(2)判断这一天是当年的第几天。
输入
输入包含若干行,每行包含三个空格间隔的正整数,它们分别表示年、月、日。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。
输出
多组,每组两行,分别为每行输入所代表的一天从公元2000年1月1日开始逝去的天数、在当年的第几天。
样例输入
2000 1 1
2009 3 14
-1
样例输出
0
1
3360
73
题目来源
NUPT
/**
* 第几天
* @param args
*/
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNextInt()){
int year=sc.nextInt();
if(year==-1)
break;
int month=sc.nextInt();
int day=sc.nextInt();
//System.out.println(year+" "+month+" "+day);
fun2(year,month,day);
}
}
方法一:使用基本算法
/**
* 使用算法求解
* @param year
* @param month
* @param day
*/
private static void fun(int year, int month, int day) {//2000/1/1
int totalDayForYear=0;//相隔的年数对应的天数
/*int a=(year-2000)/4;//这里解法错了,因为闰年不一定每隔4年一次
int b=(year-2000)%4;
if(isRN(year)){
totalDayForYear=a*(366+365*3);
}else{
totalDayForYear=a*(366+365*3)+366+365*(b-1);
}*/
for(int i=2000;i<year;i++){
if(isRN(i)){
totalDayForYear+=366;
}else{
totalDayForYear+=365;
}
}
//下面来求解这一天是在当年的第几天
int[] dayByMonthForRN={0,31,29,31,30,31,30,31,31,30,31,30,31};
int[] dayByMonthForPN={0,31,28,31,30,31,30,31,31,30,31,30,31};
int totalDayInYear=0;
if(isRN(year)){
for(int i=1;i<month;i++){
totalDayInYear+=dayByMonthForRN[i];
}
}else{
for(int i=1;i<month;i++){
totalDayInYear+=dayByMonthForPN[i];
}
}
totalDayInYear+=day;
System.out.println(totalDayForYear+totalDayInYear-1);
System.out.println(totalDayInYear);
}
private static boolean isRN(int year) {
if(year%100==0){
if(year%400==0){
return true;
}
}else{
if(year%4==0){
return true;
}
}
return false;
}
方法二:使用java提供的函数
/**
*
* 使用java提供的函数求解
* @param year
* @param month
* @param day
*/
private static void fun2(int year, int month, int day) {
String toDay = year+"-"+month+"-"+day;
String fromDay="2000-1-1";
String fromThisYearDay=year+"-1-1";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
try {
long toTime=sdf.parse(toDay).getTime();
long fromTime=sdf.parse(fromDay).getTime();
long fromThisYearTime=sdf.parse(fromThisYearDay).getTime();
System.out.println((toTime-fromTime)/(24*60*60*1000));
System.out.println((toTime-fromThisYearTime)/(24*60*60*1000)+1);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}