输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。
输入格式:
在一行中输入年月日的值以及n的值,可以用一个或多个空格或回车分隔。
输出格式:
当输入的年、月、日以及n的值非法时,输出“Wrong Format”;
当输入数据合法时,输出“n days ago is:年-月-日”
输入样例1:
在这里给出一组输入。例如:
2018 6 19 8
输出样例1:
在这里给出相应的输出。例如:
8 days ago is:2018-6-11
输入样例2:
在这里给出一组输入。例如:
2018 6 19 -8
输出样例2:
在这里给出相应的输出。例如:
-8 days ago is:2018-6-27
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean f=true;
int y=0,m=0,d=0,n=0;
if (sc.hasNextInt())
y= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
m= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
d= sc.nextInt();
else
f=false;
if (sc.hasNextInt())
n= sc.nextInt();
else
f=false;
if (checkInputValidity(y,m,d,n)&&f){
nextDate(y,m,d,n);
}else
System.out.println("Wrong Format");
}
public static boolean isLeapYear(int year) {
boolean ret=false;
if ((year%100!=0&&year%4==0)||(year%400==0)){
ret=true;
}
return ret;
}
public static boolean checkInputValidity(int year,int month,int day,int n){
boolean ret=false;
int[] mm={31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[1]=29;
if ((year>=1820&&year<=2020)&&(month>=1&&month<=12)&&(day>=1&&day<=mm[month-1])){//此处的month-1用来判断不同年份的不同月份的数据是否合法
ret=true;
}
return ret;
}
public static void nextDate(int year,int month,int day,int n) {
int[] mm={0,31,28,31,30,31,30,31,31,30,31,30,31};
if (isLeapYear(year))mm[2]=29;
day-=n;
if (n>0){
while (day<=0){
//这边是读错题写的while循环,实际上n在-10到10之间,不需要循环,但是上面的判断n的条件我没有加,
//也就是可以判断大于10和小于-10范围以外的n,但是没有详细去测试过,单这道题的测试点来讲是没有问题的
month--;
if (month==0){//这边因为是mm有0的索引,因此要提前判断是否等于0
month+=12;
year--;
}
day+=mm[month];
}
}else if (n<0){
while (day>mm[month]) {
day-=mm[month];
month++;
if (month==13){
month-=12;
year++;
}
}
}
System.out.printf("%d days ago is:%d-%d-%d\n",n,year,month,day);
}
}