There is one single line contains the day number d, month name M and year number y(1000≤y≤3000). The month name is the corresponding English name starting from the capital letter.
Output a single line with the English name of the day of week corresponding to the date, starting from the capital letter. All other letters must be in lower case. Month and Week name in Input/Output: January, February, March, April, May, June, July, August, September, October, November, December Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
9 October 2001 14 October 2001
Tuesday Sunday
//隐藏条件就是1年1月1日是星期一,把这个时间点设为锚点
//计算输入的日期与锚点之间隔了多少天
//天数对7取余,所得结果就是星期几
#include <cstdio>
#include <cstring>
int month[13][2]={
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},
{30,30},{31,31},{30,30},{31,31}
};
char month_name[13][20]={
"","January","February","March","April","May","June","July","August",
"September","October","November","December"
};
char week_name[7][20]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};
bool isLeap(int year){
return (year%4==0&&year%100!=0)||(year%400==0);
}
int main(){
int d,m,y;
char s[20];
while(scanf("%d%s%d",&d,s,&y)!=EOF){
for(m=1;m<=12;m++){
if(strcmp(s,month_name[m])==0) break;
}
int y1=1,m1=1,d1=1,day=1;
while(y1<y||m1<m||d1<d){
d1++;
if(d1==month[m1][isLeap(y1)]+1){
d1=1;
m1++;
}
if(m1==13){
m1=1;
y1++;
}
day++;
}
printf("%s\n",week_name[day%7]);
}
return 0;
}
import datetime
while True:
try:
month = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October',
'November', 'December']
week = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
d, m, y = input().split()
print(week[int(datetime.datetime(int(y), month.index(m) + 1, int(d)).strftime("%w"))])
except:
break看了下面的答案后,发现还可以更简单,"A"直接输出的是Tuesday这种格式,太方便了。于是代码可以缩成三行:
import datetime
while True:
try:
month = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October','November', 'December']
d, m, y = input().split()
print((datetime.datetime(int(y), month.index(m) + 1, int(d)).strftime("%A")))
except:
break人生苦短,我爱python。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
map<string, int> mp;
map<int,string> _mp;
string months[] = {"","January","February","March","April","May","June","July","August","September","October","November","December"};
string weekdays[] = {"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
void init()
{
for(int i = 1;i<=12;i++)
{
mp[months[i]] = i;
}
for(int i = 1 ;i<=7;i++)
_mp[i] = weekdays[i];
}
int main()
{
int d,y;
string m;
init();
while(cin >> d >> m >> y)
{
int mm = mp[m];
if(mm == 1 || mm == 2)
{
mm += 12;
y--;
}
int ans = (d+2*mm+3*(mm+1)/5+y+y/4-y/100+y/400)%7 + 1;
cout << _mp[ans] << endl;
}
}
// java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.*;
public class Main {
public static void main(String[] args) {
Map<Object, Object> map = new HashMap<>();
map.put("January", 1);
map.put("February", 2);
map.put("March", 3);
map.put("April", 4);
map.put("May", 5);
map.put("June", 6);
map.put("July", 7);
map.put("August", 8);
map.put("September", 9);
map.put("October", 10);
map.put("November", 11);
map.put("December", 12);
map.put(7, "Sunday");
map.put(1, "Monday");
map.put(2, "Tuesday");
map.put(3, "Wednesday");
map.put(4, "Thursday");
map.put(5, "Friday");
map.put(6, "Saturday");
Scanner input = new Scanner(System.in);
String[] split = input.nextLine().split(" ");
int day = Integer.parseInt(split[0]);
int month = (int) map.get(split[1]);
int year = Integer.parseInt(split[2]);
LocalDate date = LocalDate.of(year, month, day);
DayOfWeek ofWeek = date.getDayOfWeek();
System.out.println(map.get(ofWeek.getValue()));
}
} // c++
#include<bits/stdc++.h>
using namespace std;
bool isLeapYear(int year) {
return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
int daysOfYear(int year) {
if(isLeapYear(year)) return 366;
return 365;
}
int daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
vector<string> months = {"January","February","March","April","May","June","July","August","September","October","November","December"};
vector<string> weekdays = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int main() {
int year, month, day;
//char monthStr[20];
string monthStr;
//scanf("%2d %s %4d", &day, monthStr, &year);
while( cin >> day >> monthStr >> year) {
//cout << day << monthStr << year;
for(int i = 0; i < months.size(); i++) {
if(monthStr == months[i]) {
month = i;
break;
}
}
int y = year;
long long allDay = 0;
// 计算从公元1年1月1号到当前的天数
for(int i = 1; i < year; i++) {
allDay += daysOfYear(i);
}
for(int i = 0; i <= month; i++) {
allDay += daytab[isLeapYear(year)][i];
}
allDay += day - 1;
cout << weekdays[allDay % 7] << endl;
}
} //王道机试指南解法
#include<iostream>
#include<cstring>
#define ISLEAP(x) (x%4==0&&x%100!=0)||x%400==0?1:0
int YofM[13][2] = {
0,0,31,31,28,29,31,31,30,30,31,31,30,30,
31,31,31,31,30,30,31,31,30,30,31,31
};
struct Data {
int data;
int month;
int year;
Data() {
data = 1; month = 0; year = 0;
}
void nextdata() {
data++;
if (data>YofM[month][ISLEAP(year)]) {
month++; data = 1;
if (month>12)
{
year++; month = 1;
}
}//if
}
};
char monthName[13][20] = {
"","January","February","March","April","May","June","July",
"August","September","October","November","December"
};
char weekName[7][20] = {
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};
int Daycount[3001][13][32];
int main() {
Data D;
int num = 0;
while (D.year <= 3000) {
Daycount[D.year][D.month][D.data] = num;
D.nextdata();
num++;
}//while
int d, m, y;
char s[20];
while (std::cin >> d >> s >> y) {
for (m = 1; m<13; m++) {
if (strcmp(s, monthName[m]) == 0) { break; }
}//for
int i = Daycount[y][m][d] - Daycount[2018][2][25];
std::cout << weekName[(i % 7 + 7) % 7];
}//while
return 0;
} #include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char mon[][20]={" ","January","February","March","April","May","June","July","August","September","October","November","December"};
char week[][20]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool leap(int y){
if(y%400==0||(y%4==0&&y%100!=0))return true;
else return false;
}
int days(int y,int m,int d){
int sum=0;
for(int i=1;i<y;++i){
if(leap(i))sum+=366;
else sum+=365;
}
if(leap(y))day[2]=29;
else day[2]=28;
for(int j=1;j<m;++j){
sum+=day[j];
}
sum+=d;
return sum;
}
int main(){
int y,m,d;
char month[20];
while(cin>>d>>month>>y){
for(int i=1;i<13;++i){
if(strcmp(month,mon[i])==0){
m=i;
break;
}
}
int cnt1=days(y,m,d);
int cnt2=days(2018,3,7);
int del=cnt1-cnt2;
del=del%7;
cout<<week[(del+3)%7];
}
return 0;
}
#include<stdio.h>
#include<string.h>
#define ISYEAR(x) x%100!=0&&x%4==0||x%400==0?1:0
int dateOfMonth[13][2]={
0,0,
31,31,
28,29,
31,31,
30,30,
31,31,
30,30,
31,31,
31,31,
30,30,
31,31,
30,30,
31,31
};
struct Date{
int Year;
int Month;
int Day;
void NextDay(){
Day++;
if(Day>dateOfMonth[Month][ISYEAR(Year)]){
Day=1;
Month++;
if(Month>12){
Month=1;
Year++;
}
}
}
};
int buf[3001][13][32];
char MonthName[13][20]={
" ",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
char WeekName[7][20]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
int main(){
Date tmp;
tmp.Year=0;
tmp.Month=1;
tmp.Day=1;
int cnt=0;
while(tmp.Year!=3001){
buf[tmp.Year][tmp.Month][tmp.Day]=cnt;
tmp.NextDay();
cnt++;
}
int d,m,y;
char s[20];
while(scanf("%d%s%d",&d,s,&y)!=EOF){
for(m=1;m<13;m++){
if(strcmp(MonthName[m],s)==0)
break;
}
}
int days=(buf[y][m][d]-buf[2012][7][16])+1;
printf("%s",WeekName[(days%7+7)%7]);
}
//方法二:这里使用比较简洁的做法,已知1年1月1日是星期一,则只要计算目标年份与1年1月1日的距离日期再对7取余即可
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
//用来映射月份
string months[12] = {"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
int monthday[2][12] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
//自定义一个函数用来判断是否为闰年
bool isleapyear(int year) {
if ((year % 4 == 0 && year % 100 != 0 )|| year % 400 == 0)
return true;
else
return false;
}
string weekday[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday", "Sunday"};
int main() {
int n;//用来计算自1年1月1日的距离天数
int day,year;
string month;
int mon;
int week_day=0;
while (cin >> day >> month >> year) {
n=0;
for (int i = 1; i < year; i++) {
n += isleapyear(i) ? 366 : 365;
}
for (int i = 0; i < 12; i++) {
if (months[i] == month)
mon = i; //得到第几个月
}
for (int i=0;i<mon;i++){
n+=monthday[isleapyear(year)][i];
}
n+=(day-1);
week_day=n%7;
cout<<weekday[week_day]<<endl;
}
} import java.util.*;
public class Main{
static int months[][]= {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
static int isLeapYear(int year){
if(year%4==0&&year%100!=0||year%400==0){
return 1;
}return 0;
}
static int getMonth(String m){
Map<String,Integer>map=new HashMap<>();
map.put("January", 1);
map.put("Febrary", 2);
map.put("March", 3);
map.put("April", 4);
map.put("May", 5);
map.put("June", 6);
map.put("July", 7);
map.put("August", 8);
map.put("September", 9);
map.put("October", 10);
map.put("November", 11);
map.put("December", 12);
int month=map.get(m);
return month;
}
static String getWeek(int n){
Map<Integer,String>map=new HashMap<>();
map.put(0, "Sunday");
map.put(1, "Monday");
map.put(2, "Tuesday");
map.put(3, "Wednesday");
map.put(4, "Thursday");
map.put(5, "Friday");
map.put(6, "Saturday");
String week=map.get(n);
return week;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
//输入
int day=sc.nextInt();
String m=sc.next();
int month=getMonth(m);
int year=sc.nextInt();
int n=help(year,month,day);
System.out.println(getWeek(n%7));
}
}
private static int help(int y, int m, int d) {
int day=1;
int y1=1,m1=1,d1=1;
while(y1<y||m1<m||d1<d) {
d1++;
if(d1==months[isLeapYear(y1)][m1]+1){
d1=1;
m1++;
}
if(m1==13){
m1=1;
y1++;
}
day++;
}
return day;
}
} 卡在了求日期间隔的地方一个多小时,不知道为什么,下面求日期的做法就是错的。。 //很好理解啊,为啥错了呢???
int help(int y, int m, int d) {
int sum=0;
for(int i=1;i<y;i++) {
sum+=365;
sum+=isLeapYear(y);
}
for(int i=1;i<m;i++) {
sum+=months[isLeapYear(y)][i];
}
return sum+=d;
} import java.time.LocalDate;
import java.time.Month;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
int day = scanner.nextInt();
String month = scanner.next();
int year = scanner.nextInt();
LocalDate date = LocalDate.of(year, Month.valueOf(month.toUpperCase()), day);
String s = date.getDayOfWeek().toString().toLowerCase();
System.out.println(s.substring(0,1).toUpperCase()+s.substring(1));
}
}
}
#include<iostream>
#include<string>
using namespace std;
int totalDay(int day, string str, int year) {
int total = 0;
int totalNum = 0;
int table[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (str == "January") total = 0;
else if (str == "February") total = 1;
else if (str == "March") total = 2;
else if (str == "April") total = 3;
else if (str == "May") total = 4;
else if (str == "June") total = 5;
else if (str == "July") total = 6;
else if (str == "August") total = 7;
else if (str == "September") total = 8;
else if (str == "October") total = 9;
else if (str == "November") total = 10;
else if (str == "December") total = 11;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
table[1] = 29;
if (total>0) {
for (int i = 0; i<total; i++)
totalNum += table[i];
}
return totalNum + day - 1;
}
int main() {
int year, day;
string month;
int origin = 6;//2000年1月1日为周六
while (cin >> day >> month >> year) {
int total = 0;
origin = 6;
if (year - 2000 >= 0) {
switch ((year - 2000) % 4) {
case 0: total = ((year - 2000) / 4)*(366 + 365 * 3); break;
case 1: total = ((year - 2000) / 4)*(366 + 365 * 3) + 366; break;
case 2: total = ((year - 2000) / 4)*(366 + 365 * 3) + 366 + 365; break;
case 3: total = ((year - 2000) / 4)*(366 + 365 * 3) + 366 + 365 * 2; break;
}
total += totalDay(day, month, year) - ((year - 2000) / 100 - (year - 2000) / 400);
origin = (origin + total) % 7;
}
else {
switch ((2000 - year) % 4) {
case 1: total = ((2000 - year) / 4)*(366 + 365 * 3) + 365; break;
case 2: total = ((2000 - year) / 4)*(366 + 365 * 3) + 365 * 2; break;
case 3: total = ((2000 - year) / 4)*(366 + 365 * 3) + 365 * 3; break;
case 0: total = ((2000 - year) / 4)*(366 + 365 * 3); break;
}
total -= totalDay(day, month, year) - ((year - 2000) / 100 - (year - 2000) / 400);
origin = (origin - total % 7 > 0 ? origin - total % 7 : origin + 7 - total % 7) % 7;
}
switch (origin) {
case 0: cout << "Sunday"<<endl; break;
case 1: cout << "Monday"<<endl; break;
case 2: cout << "Tuesday"<<endl; break;
case 3: cout << "Wednesday"<<endl; break;
case 4: cout << "Thursday"<<endl; break;
case 5: cout << "Friday"<<endl; break;
case 6: cout << "Saturday"<<endl; break;
}
}
}
from datetime import datetime
Month = {'May': 5, 'December': 12, 'October': 10, 'August': 8,
'July': 7, 'February': 2, 'January': 1, 'September': 9,
'March': 3, 'April': 4, 'November': 11, 'June': 6}
try:
while 1:
k = raw_input().split()
print datetime(int(k[2]),Month[k[1]],int(k[0])).strftime('%A').capitalize()
except:
pass
//习题2.7
#include<map>
#include<cstdio>
#include<string>
using namespace std;
int main(){
//概要:今天是2026年3月12日星期四,以这个为基准,算出通过输入的日期是星期几
int year,mon,day; //year是年,day是日,mon表示是第几个月
char str[100]; //c风格字符串用来做输入和输出
string month;
int mDay[31]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //mDay[1]表示1月有多少天
string intToWeekDay[7]={"Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday", "Saturday"};
//map从string映射到int
map<string,int> monthToint{ //将月份对应为整数
{"January",1},
{"February",2},
{"March",3},
{"April",4},
{"May",5},
{"June",6},
{"July",7},
{"August",8},
{"September",9},
{"October",10},
{"November",11},
{"December",12}
};
bool isBefore; //isBefore为真则在今天之前,为假则在今天之后
while(scanf("%d %s %d",&day,str,&year)!=EOF){ //scanf用c风格输入
//1.得到输入字符串月份的对应值,即是一年的第几个月
month=str; //将字符串从c风格转换为c++风格
mon=monthToint[month]; //名称[键]-->得到值,如 monthToint[January]可以得到1
//2.判断在今天之前还是之后
if(year<2026
|| 2026==year && mon<3
|| 2026==year && 3==mon && day<12){ //今天是2026年3月12日
isBefore=true; //为真则在今天之前
}else{
isBefore=false; //为假则在今天之后
}
//3.根据输入的年月日是在今天之前还是之后,初始化起点和终点
int begYear,begMon,begDay,endYear,endMon,endDay;
if(isBefore==true){ //为真则输入的日期在今天之前
begYear=year;
begMon=mon;
begDay=day;
endYear=2026;
endMon=3;
endDay=12;
}else{ //为假则输入的日期在今天之后
begYear=2026;
begMon=3;
begDay=12;
endYear=year;
endMon=mon;
endDay=day;
}
//4.从begin走到end
int totalDay=0; //用于记录到最终end走了多少天
while(true){
if(begYear==endYear && begMon==endMon && begDay==endDay){ //当beg走到了end则退出
break;
}
totalDay++; //每循环一次,总天数往后加一
//nextDay操作(日期问题常规模板)
if(begYear%400==0 || begYear%100!=0 &&begYear%4==0){ //判断这一年是否为闰年,是闰年则2月有29天
mDay[2]=29;
}else{
mDay[2]=28;
}
begDay++; //天数加一
if(begDay>mDay[begMon]){ //当天数超过了该月的天数,则去往下一个月1日
begMon++; //月加一
begDay=1; //天数重置为1
if(begMon>12){ //当月数加一之后,超过了12,说明一年走完了,要进入下一年1月
begYear++; //年加一
begMon=1; //月重置为1
}
}
}
//5.通过totalDay,计算是周几
if(isBefore==true){ //输入的日期在今天之前
//(x+totalDay)%7=4 --> x=(11-totalDay%7)%7
int weekday=(11-totalDay%7)%7;
printf("%s\n",intToWeekDay[weekday].c_str());
}else{ //输入的日期在今天之后
//得到了整数,现在需要输出的是字符串
int weekday=(totalDay+4)%7; //得到的是0~6之间的数,0对应周日,1对应周一...
//weekday是int型,通过与数组intToWeekDay下标对应转为string类型是c++风格的;输出用的c风格,再转为c风格即可.c_str()
printf("%s\n",intToWeekDay[weekday].c_str());
}
}
} from datetime import datetime, timedelta, date
dic = {}
dic['January'] = 1
dic['February'] = 2
dic['March'] = 3
dic['April'] = 4
dic['May'] = 5
dic['June'] = 6
dic['July'] = 7
dic['August'] = 8
dic['September'] = 9
dic['October'] = 10
dic['November'] = 11
dic['December'] = 12
while True:
try:
d, m, y = list(input().split())
dt = datetime(int(y), dic[m], int(d))
print(dt.strftime('%A'))
except:
break