这道题,不是很难,但是细节性很强。我就耗了大半天的时间找问题,结果都对,就是检查不出来,咱们学计算机的人要的就是严谨,真是,犯一点错误就够你找一天的。好了,说说这道题。首先,要确定以那个时间为标准去计算,这里我选择了1年1月1号,这一天一定是星期一。一次为标准去计算总天数
第二,拿着总天数除以7,余数在0到6之间,是几就是星期几。
第三,这些都好弄,就是输出不合法条件不好弄,太容易漏了。2月里有特殊情况,有28天,有29天不能超,单独排除。1,3,5,7,810,12月不能超31天,4,6,9,11月不能超30天,都要考虑细一些,别漏了。本人是菜鸟,所以漏情况多,考虑不细,可能写多了,希望对和我一样的人还是有帮助的。
import java.util.Scanner;
//1年1月1日为星期一,以此为标准计算
public class Hdu2133 {
public static void main(String[] args){
Scanner sc=new Scanner (System.in);
while(sc.hasNext()){
int year=sc.nextInt();
int month=sc.nextInt();
int day=sc.nextInt();
//输入不合法情况排除
if((month==2&&runnian(year)&&day>29)||(month==2&&!runnian(year)&&day>28)){ //输入不合法情况2月
System.out.println("illegal");
}
else if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31){//输入不合法的情况31天的
System.out.println("illegal");
}
else if((month==4||month==6||month==9||month==11)&&day>30){//输入不合法的情况30天的
System.out.println("illegal");
}
else if(year<=0||month<=0||month>=13||day<=0){ //输入不合法的情况
System.out.println("illegal");
}
else{ //合法情况
int months[];
int days=0;//记录今年的第多少天
if(runnian(year)){
months=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
for(int i=1;i<=month-1;i++){
days+=months[i];
}
days=days+day;
}
else {
months=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=1;i<=month-1;i++){
days+=months[i];
}
days=days+day;
}
String zhou[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int d=0;//记录距离1年到现在闰年的个数
for(int i=1;i<=year-1;i++){
if(runnian(i)){
d++;
}
}
// System.out.println(d);
// System.out.println(days);
int sum=d*366+(year-d-1)*365+days;
// System.out.println(sum);
for(int i=0;i<=6;i++){
if(sum%7==i){ //整除7(模为0)即一周的最后一天,周天
System.out.println(zhou[i]);
}
}
}
}
}
//判断是否是闰年
static boolean runnian(int years){
boolean t;
if((years%4==0&&years%100!=0)||years%400==0){
t=true;
}
else t=false;
return t;
}
}