夏季每日一题打卡day5——AcWing 3489. 星期几
Posted Johnny*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了夏季每日一题打卡day5——AcWing 3489. 星期几相关的知识,希望对你有一定的参考价值。
【题目描述】
【思路】
口诀:
一三五七八十腊(十二) 三十一天永不差
四六八十30天 二月闰年是29 平年是28
import java.io.*;
import java.util.Map;
import java.util.HashMap;
public class Main{
static String []month = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
static Map<String, Integer> months = new HashMap<>();
static String week[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
static int days[] ={31,28,31,30,31,30,31,31,30,31,30,31};
public static boolean isRun(int y){
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
//计算今年是从1年1月1日开始的第几天time
public static String getWeek(int y, int m, int d){
long res = 0;
for(int i = 1; i < y; i ++){//从1年1月1日到今年的1年1月1日(不包括这一天)一共过去了几天
if( isRun(i) ) res += 366;
else res += 365;
}
//今年是否是闰年
boolean flag = isRun(y);
//计算从今年1月1日到今年的m月的1日(不包括这一日)又过去了多少天
for(int i = 0; i < m; i ++){
if( flag && i == 1){//闰年二月要特判
if( m == 1 )//m只到二月过
res += d;
else res += 29;
continue;
}
//其他情况都直接加上
res += days[i];
}
//计算从m月1日到m月d日一共过去了多少天
res += d;
//注意下标对应关系 Monday是下标0
return week[ (int)((res - 1 ) % 7 )];
}
public static void main(String args[]) throws Exception{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
for(int i = 0; i < month.length; i ++)
months.put( month[i], i);
String str = null;
while( (str = bf.readLine()) != null ){
String s [] = str.split(" ");
int y = Integer.parseInt(s[2]);
int m = months.get(s[1]);
int d = Integer.parseInt(s[0]);
System.out.println( getWeek(y, m, d));
}
}
}
以上是关于夏季每日一题打卡day5——AcWing 3489. 星期几的主要内容,如果未能解决你的问题,请参考以下文章
ACWing夏季每日一题打卡day —— AcWing 3493. 最大的和
夏季每日一题打卡day4 —— AcWing 3502. 不同路径数
夏季每日一题打卡day3 —— AcWing 3499. 序列最大收益