《算法笔记》3.4小节——入门模拟->日期处理
1928 Problem A 日期差值
经典的日期差值模拟
注意平年闰年的差别,两个时间点之间的差值用较小的时间不断累加来追上较大的时间,累加时注意到达其上时递进
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
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} };
//平年和闰年每个月的天数
int main() {
int date1, date2;
while (scanf("%d %d", &date1, &date2) != EOF) {
if (date1 > date2) swap(date1, date2);
int year1 = date1 / 10000, year2 = date2 / 10000;
int month1 = (date1 % 10000) / 100, month2 = (date2 % 10000) / 100;
int day1 = date1 % 100, day2 = date2 % 100;
int ans=1;//记录所差天数;
while (year1 < year2 || month1 < month2 || day1 < day2) {
day1++;
if (day1 == month[month1][year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0] + 1){
month1++;
day1 = 1;
}
if (month1 == 13) {
year1++;
month1 = 1;
}
ans++;
}
printf("%d\n", ans);
}
return 0;
}
1929 Problem B Day of Week
月份顺序写错了,害我改了好久
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
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 monthname[13][10] = { " ","January","February","March","April","May","June","July","August","September","October","November","December" };
//记录月份名称,注意一系列字符串存储方式是二维数组存储
char weekname[8][10] = { " ","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday" };
int monthtonumber(char a[]) {
int i;
for (i = 1; i < 13; i++) {
if (strcmp(a, monthname[i]) == 0)
break;
}
return i;
}
int ansnum(int d1, int m1, int y1, int d2, int m2, int y2) {
int ans = 0;
while (y1 < y2 || m1 < m2 || d1 < d2) {
d1++;
if (d1 > month[m1][(y1 % 4 == 0 && y1 % 100 != 0) || (y1 % 400 == 0)]) {
d1 = 1; m1++;
}
if (m1 > 12) {
m1 = 1; y1++;
}
ans++;
}
return ans;
}
int main() {
int d, m, y;
int w;
//char wname[10];
char mname[10];
//2020年3月15日星期日
while (scanf("%d %s %d", &d, &mname, &y) != EOF) {
int y0 = 2020, m0 = 3, d0 = 15, w0 = 7;
int ans = 0;
m = monthtonumber(mname);
if (y0 > y || (y0 == y && m0 > m) || (y0 == y && m0 == m && d0 > d)) {
swap(y, y0); swap(m, m0); swap(d, d0);
ans = ansnum(d0, m0, y0, d, m, y);
w = w0 - ans % 7;
}
else {
ans = ansnum(d0, m0, y0, d, m, y);
w = (w0 +ans % 7) % 7;
}
//strcpy(wname, weekname[w]);
//printf("%s\n", wname);
printf("%s\n", weekname[w]);
}
return 0;
}
1931 Problem C 打印日期
注意年份长度4 月份2 日期2;以及
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
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} };
//平年和闰年每个月的天数
int main() {
int y, m, d, n;
while(scanf("%d %d", &y, &n) != EOF) {
m = 1, d = 0;
for (int i = 0; i < n; i++) {
d++;
if (d > month[m][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)]) {
d = 1; m++;
}
}
printf("%04d-%02d-%02d\n", y, m, d);
}
return 0;
}
或者先算月份后算天数,循环次数更少
#include <stdio.h>
#include <string.h>
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} };
//平年和闰年每个月的天数
int main() {
int y, m, d, n;
while (scanf("%d %d", &y, &n) != EOF) {
m = 1, d = 0;
int i = 1;
while (n > month[i][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)]) {
n -= month[i][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)];
m++;
i++;
}
while (n--) {
d++;
if (d > month[m][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)]) {
d = 1; m++;
}
if (m > 12) {
y++; m = 1;
}
//此处也要考虑进位问题;不能直接输出n
}
printf("%04d-%02d-%02d\n", y, m, d);
}
return 0;
}
2026 Problem D 日期类
#include <stdio.h>
#include <string.h>
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} };
//平年和闰年每个月的天数
int main() {
int n;
scanf("%d", &n);
while (n--) {
int y, m, d;
scanf("%d %d %d", &y, &m, &d);
d++;
if (d > month[m][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)]) {
d = 1;
m++;
}
if (m > 12) {
y++;
m = 1;
}
printf("%04d-%02d-%02d\n", y, m, d);
}
}
2063 Problem E 日期累加
#include <stdio.h>
#include <string.h>
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} };
//平年和闰年每个月的天数
int main() {
int n;
scanf("%d", &n);
while (n--) {
int y, m, d, cnt;
scanf("%d %d %d %d", &y, &m, &d, &cnt);
while (cnt >= month[m][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)]) {
cnt -= month[m][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)];
m++;
if (m > 12) {
y++; m = 1;
}
}
while (cnt--) {
d++;
if (d > month[m][(y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)]) {
d = 1; m++;
}
if (m > 12) {
y++; m = 1;
}
//此处也要考虑进位问题
}
printf("%04d-%02d-%02d\n", y, m, d);
}
}