2099爱算日期的曾小浪
链接: 原题网址.
Description
曾小浪沉浸在魔兽世界这款游戏中无法自拔,可是日子一天天过去曾小浪的作业也快要到了截止日期。
沉浸在游戏中的曾小浪只记得具体截止日期,他现在特别傲娇的想要知道那天是星期几。
希望大家来帮帮他。
Input
输入有多组,每组占一行。
每组有三个整数y,m,d,分别代表年月日
Output
星期几
Samples
input
2016 5 24
output
Tuesday
题解
方法1: 蔡勒公式
链接: 蔡勒公式.
#include<stdio.h>
int main()
{
char a[8][100] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
int w,y, m, d;//y代表年份,m代表月份,d代表日期
while (scanf("%d %d %d", &y, &m, &d) != EOF) {
if (m < 3) {
m += 12;
y--;
}//蔡勒公式在计算1、2月份时要换算成上一年的13、14月份
w= (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;//蔡勒公式化简,直接使用公式存在错误。
printf("%s\n", a[(w+1)%7]);//蔡勒公式计算结果换算成日期
}
return 0;
}
方法2:换算成日期差
PS:注意闰年和平年
#include<stdio.h>
char s[8][20] = { "Wednesday","Thursday","Friday","Saturday","Sunday","Monday","Tuesday" };
int main() {
int y, d, n, m, sum = 0;
while (scanf("%d %d %d", &y, &m, &d) != EOF) {
sum = 0;//选取某一天为基准,本代码以2020年1月1日为起点
if (y > 2020) {
for (int i = 2020; i < y; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
sum += 366;
}
else sum += 365;
}//计算年份差,区分闰年和平年
for (int i = 1; i < m; i++) {
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)sum += 31;
else if (i == 4 || i == 6 || i == 9 || i == 11)sum += 30;
else if (i == 2) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
sum += 29;
}
else sum += 28;
}
}//计算月份差,区分每一个月
sum += d - 1;//计算日期差
}//计算2020年1月1日以后的日期用加法
else {
for (int i = y; i < 2020; i++) {
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
sum -= 366;
}
else sum -= 365;
}//计算到当年的1月1日,所以后面用加法
for (int i = 1; i < m; i++) {
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)sum += 31;
else if (i == 4 || i == 6 || i == 9 || i == 11)sum += 30;
else if (i == 2) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
sum += 29;
}
else sum += 28;
}
}
sum += d - 1;
}//计算2020年1月1日前用减法
if (sum >= 0)sum %= 7;
else sum = sum % 7;
if (sum < 0)sum += 7;//换算成正的日期差
printf("%s\n", s[sum]);
}
return 0;
}