首页 > 试题广场 > Day of Week
[编程题]Day of Week
  • 热度指数:8498 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
We now use the Gregorian style of dating in Russia. The leap years are years with number divisible by 4 but not divisible by 100, or divisible by 400. For example, years 2004, 2180 and 2400 are leap. Years 2005, 2181 and 2300 are not leap. Your task is to write a program which will compute the day of week corresponding to a given date in the nearest past or in the future using today’s agreement about dating.

输入描述:
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
示例1

输入

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;
}
发表于 2019-02-12 11:17:47 回复(1)

Python四行代码,利用datetime库。

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。

编辑于 2019-04-18 20:51:19 回复(2)
#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;
    }
}

发表于 2019-03-06 00:57:18 回复(9)
基姆拉尔森计算公式
W= (d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
编辑于 2019-02-27 10:23:56 回复(0)
//王道机试指南解法
#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;
}

编辑于 2018-03-04 23:35:10 回复(0)
import datetime
print datetime.datetime.strptime(raw_input(), "%d %B %Y").strftime("%A")

Python其实只要两行233

编辑于 2018-02-08 16:37:22 回复(2)
#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;
}

发表于 2018-03-07 01:52:22 回复(2)
Java

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));
        }
    }
}


发表于 2020-03-19 23:34:54 回复(0)
// 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;
    }
}



编辑于 2020-02-18 10:46:55 回复(0)
用的基姆拉尔森公式,最开始用的蔡勒公式,但是只能过85%。。。。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int test(int year)
{
    if(year%400==0||(year%100!=0&&year%4==0))
        return 1;
    else
        return 0;
}
int main(void)
{
    string months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    int day,year,month;
    int c,m,d,y,w;
    string str_m;
    while(cin>>day>>str_m>>year)
    {
        for(int i=0;i<12;i++)
        {
            if(str_m==months[i])
            {
                month=i+1;
                break;
            }
        }
        if(month==1)
        {
            m=13;
            y=year-1;
        }
        else if(month==2)
        {
            m=14;
            y=year-1;
        }
        else
        {
            m=month;
            y=year;
        }
        c=y/100;
        d=day;
        w = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) % 7;
        switch(w){
            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;
        }
    }
    return 0;
}
发表于 2019-11-23 22:51:48 回复(0)
真实麻烦QAQ,果然Python大法好
#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;
        }
    }
}

发表于 2019-02-10 21:48:05 回复(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]);    
}


发表于 2018-03-05 17:17:20 回复(0)
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

发表于 2016-12-25 16:52:08 回复(0)
#include<cstdio>
#include<map>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
bool isyun(int y){
    if(y%4==0&&y%100!=0||y%400==0)
        return true;
    return false;
}
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}};
map<string,int> m;
string s[7]={"Sunday","Monday","Tuesday", "Wednesday","Thursday", "Friday", "Saturday"};
int main(){
	m["January"]=1,m["February"]=2,m["March"]=3,m["April"]=4,m["May"]=5;
    m["June"]=6,m["July"]=7,m["August"]=8,m["September"]=9,m["October"]=10;
    m["November"]=11,m["December"]=12;
    int y2,d2,week2;
    string mm2;
    while(cin>>d2>>mm2>>y2){
    int y1=2020,m1=4,d1=21,week1=2;
    //cout<<y2<<m[mm2]<<d2<<endl;
    int m2=m[mm2];
    int sum1=y1*10000+m1*100+d1;
    int sum2=y2*10000+m2*100+d2;
    int flag=0;
    if(sum2<sum1)
    {
        flag=1;
        swap(y1,y2);
        swap(m1,m2);
        swap(d1,d2);
    }
    int sum=0;
    while(y1!=y2||d1!=d2||m1!=m2){
          d1++;
          sum++;
          if(d1>month[m1][isyun(y1)]){
              d1=1;
              m1++;
              if(m1>12)
              {
                  m1=1;
                  y1++;
              }
          }
    }
    if(flag==1){
        week2=((week1+(sum/7+1)*7)-sum)%7;
    }else{
        week2=(week1+sum)%7;
    }
    cout<<s[week2]<<endl;
    }
    return 0;
}

编辑于 2020-04-22 13:53:44 回复(0)
java版本
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;
}



发表于 2020-04-11 09:43:26 回复(0)
#include <bits/stdc++.h>
using namespace std;
map<string,int>m;
bool leap(int y) {
	return (y%4==0&&y%100!=0)||(y%400==0);
}
void initmap(){
	m["January"]=1;
	m["February"]=2;
	m["March"]=3;
	m["April"]=4;
	m["May"]=5;
	m["June"]=6;
	m["July"]=7;
	m["August"]=8;
	m["September"]=9;
	m["October"]=10;
	m["November"]=11;
	m["December"]=12;
	
	
}
int main(){
	string week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
	int datedate[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}
	};
	int d,y,date;
	string s;
	initmap();
	while(cin>>d>>s>>y){
		date=0;
		for(int i=1;i<y;i++){
			if(leap(i))date+=366;
			else date+=365;
		}
	//	cout<<"y "<<date<<endl;
	//	cout<<s<<" "<<m[s]<<endl;
		for(int i=1;i<m[s];i++){
			date+=datedate[leap(y)][i];
		}
	//	cout<<"m "<<date<<endl;
		date+=d-1;
	//	cout<<"d "<<date<<endl;
	cout<<week[date%7]<<endl;
	}
	return 0;
}

发表于 2020-04-02 12:31:44 回复(0)
#include <cstdio>
(802)#include <cstring>
char days[7][10] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char months[12][15] = {"January", "February", "March", "April", "May", "June",
            "July", "August", "September", "October", "November", "December"};
int radix[12][2] = {{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 yymmdd
{
    int yy, mm, dd;
};

int change(char s[])
{
    for(int i = 0; i <= 11; i++)
    {
        if(strcmp(s, months[i]) == 0)
        {
            return i + 1;
        }
    }
    return -1;
}

int main()
{
    yymmdd d1, d2;
    char month[15];
    scanf("%d %s %d", &d1.dd, month, &d1.yy);
    d1.mm = change(month);
    d2.yy = 2001; d2.mm = 10; d2.dd = 14;
    int date1 = d1.yy * 10000 + d1.mm * 100 + d1.dd;
    int date2 = d2.yy * 10000 + d2.mm * 100 + d2.dd;
    int flag = 1;
    if(date1 > date2)
    {
        flag = -1;
        int tmp;
        tmp = d1.yy; d1.yy = d2.yy; d2.yy = tmp;
        tmp = d1.mm; d1.mm = d2.mm; d2.mm = tmp;
        tmp = d1.dd; d1.dd = d2.dd; d2.dd = tmp;
    }
    int ans = 0;
    while(1)
    {
        if(d1.yy == d2.yy && d1.mm == d2.mm && d1.dd == d2.dd)
        {
            printf("%s\n", days[(ans * flag % 7 + 7) % 7]);
            break;
        }
        else
        {
            ans--;
            int flag;
            if((d1.yy % 100 != 0 && d1.yy % 4 == 0) || d1.yy % 400 == 0) flag = 1;
            else flag = 0;
            if(d1.dd == radix[d1.mm - 1][flag])
            {
                d1.mm++;
                d1.dd = 1;
            }
            else d1.dd++;
            if(d1.mm == 13)
            {
                d1.yy++;
                d1.mm = 1;
            }
        }
    }
    return 0;
}

/*

1. 关于本题

    与日期差值的核心思路一致,但是需要处理日期差值对应的星期几输出(本题区分增减)。看了一圈别人的
代码,得到如下优化策略;
    0.1 初始化另一个日期为取值范围以外的数,使得差值恒正或恒负。
    0.2 基姆拉尔森计算公式。

*/

发表于 2020-03-25 09:23:51 回复(0)
不用记什么公式,一点点加上去就行了
#include <iostream>
#include <map>
#define leap(x) (x % 400 == 0 || (x % 4 == 0 && x % 100 != 0))
using namespace std;

int num[12][2] = {31, 31, 28, 29, 31, 31, 30, 30, 31, 31, 30, 30, 31, 31, 31, 31, 30, 30, 31, 31,
30, 30, 31, 31};
string month[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
string week[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
map<string, int> mp;
void init() {
    for(int i = 0; i < 12; i++) {
        mp[month[i]] = i + 1;
    }
}
int cal(int y1, int m1, int d1, int y2, int m2, int d2) {
    int res = 0;
    while(y1 < y2 || m1 < m2 || d1 < d2) {
        res++;
        d1++;
        if(d1 > num[m1 - 1][leap(y1)]) {
            m1++;
            d1 = 1;
        }
        if(m1 > 12) {
            y1++;
            m1 = 1;
        }
    }
    return res;
}
int main() {
    init();
    int yy, dd, now = 2020 * 10000 + 3 * 100 + 22;
    string mm;
    while(cin >>dd >>mm >>yy) {
        int t = yy * 10000 + mp[mm] * 100 + dd, diff;
        if(t < now) {
            diff = cal(yy, mp[mm], dd, 2020, 3, 22);
            cout <<week[(0 - diff + 7 * 100000000) % 7] <<endl;
        }
        else {
            diff = cal(2020, 3, 22, yy, mp[mm], dd);
            cout <<week[(0 + diff + 7 * 100000000) % 7] <<endl;
        }

    }
    return 0;
}


编辑于 2020-03-22 20:55:18 回复(0)

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;

public class Main {
    private static String month[] = {
            "","January", "February","March", "April",
            "May", "June", "July", "August", "September",
            "October", "November", "December"
    };
    private static String week[] = {
            "Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    };
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        String date = sc.nextLine();
        String[] dates = date.split(" ");
        int m = 1;
        for (int i=1;i<month.length;i++){
            if (dates[1].equals(month[i])){
                m = i;
            }
        }
        String M = m < 10 ? "0" + m : "" + m;
        String day = dates[2] + M + dates[0];
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Date fd = format.parse(day);
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(fd);
        int dw = calendar.get(calendar.DAY_OF_WEEK);
        System.out.println(week[dw - 1]);
    }
}

发表于 2020-03-21 11:22:15 回复(0)
//感觉写的挺垃圾的
#include <stdio.h>
(737)#include <iostream>
#include <string.h>
(845)#include <string>
#include <map>
using namespace std;

int lmonth[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
int cmonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 
map<string, int> monToNum;
map<int, string> days;

int dayBegin = 1, monBegin = 1, yesBegin = 1;
int dayEnd, monEnd, yesEnd;

void initMap(){
    monToNum["January"] = 1;monToNum["February"] = 2;monToNum["March"] = 3;monToNum["April"] = 4;monToNum["May"] = 5;monToNum["June"] = 6;monToNum["July"] = 7;monToNum["August"] = 8;monToNum["September"] = 9;monToNum["October"] = 10;monToNum["November"] = 11;monToNum["December"] = 12;
    days[0] = "Monday";days[1] ="Tuesday";days[2] ="Wednesday";    days[3] ="Thursday";days[4] ="Friday";days[5] ="Saturday";days[6] ="Sunday";
}
bool isleapyear(int year){
    if(year % 400 == 0){
        return true;
    }
    if(year % 4 == 0 && year % 100 != 0){
        return true;
    }
    return false;
}

int cal(int dayEnd, int monEnd, int yesEnd){
    dayBegin = 1, monBegin = 1, yesBegin = 1;
    int result  = 0;
    int monDays;
    bool isLeap;
    while(dayEnd > dayBegin || monEnd > monBegin || yesEnd > yesBegin){
        isLeap = isleapyear(yesBegin);
        if(isLeap){
            monDays = lmonth[monBegin - 1];
        }else{
            monDays = cmonth[monBegin - 1];
        }
        dayBegin++;
        if(dayBegin > monDays){
            dayBegin = 1;
            monBegin++;
        }
        if(monBegin > 12){
            monBegin = 1;
            yesBegin++;
        }
        result++;
    }
    return result % 7;
}

void print(int res){
    cout <<days[res]<<endl;
}

int main(){
    initMap();
    char monEndString[20];
    while(scanf("%d %s %d", &dayEnd, monEndString, &yesEnd) != EOF){
        monEnd = monToNum[monEndString];
        print(cal(dayEnd, monEnd, yesEnd));
    }
    return 0;
}


发表于 2020-03-16 16:52:59 回复(0)

问题信息

难度:
54条回答 6005浏览

热门推荐

通过挑战的用户

查看代码