100000578 - 《算法笔记》3.4小节——入门模拟->日期处理

《算法笔记》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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值