杭电Hdu 2133 What day is it

这道题,不是很难,但是细节性很强。我就耗了大半天的时间找问题,结果都对,就是检查不出来,咱们学计算机的人要的就是严谨,真是,犯一点错误就够你找一天的。好了,说说这道题。首先,要确定以那个时间为标准去计算,这里我选择了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;
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值