日期相关问题

一、平年:365天,2月28天。

二、闰年:366天,2月29天。

求闰年函数:(闰年分为普通润年和世纪闰年,普通闰年年分是4倍数不是100倍数,世纪闰年是400的倍数)

bool run(int x) {
	if((x % 4 == 0 && x % 100 != 0 )|| x % 400 == 0)
		return true;
	return false;
}

三、计算从公元1年开始开始,一直到今天的总天数

板子一:

#include<bits/stdc++.h>
using namespace std;

int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//从d[1]开始存

bool run(int x) {
	if((x % 4 == 0 && x % 100 != 0 )|| x % 400 == 0)
		return true;
	return false;
}

int day(int s) {
	int x = s / 10000;//年
	int y = s % 10000 / 100;//月
	int z = s % 10000 % 100;//日
	if(run(x)) d[2] = 29;
	else d[2] = 28;
	int ans = 0; //存储结果
	while(x--) ans += (run(x) ? 366 : 365); //求年份总天数
	while(y--) ans += d[y]; //求月份总天数
	ans += z; //加上天数
	return ans;
}

int main( ) {
	int x;//x是0000/00/00这种形式,如20230101,2023.1.1
	cin >> x;
	cout << day(x);
	return 0;
}

板子二:

#include<bits/stdc++.h>
using namespace std;

int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//从d[1]开始存

bool run(int x) {
	if((x % 4 == 0 && x % 100 != 0 )|| x % 400 == 0)
		return true;
	return false;
}

int day(int x,int y,int z) {
	if(run(x)) d[2] = 29;
	else d[2] = 28;
	int ans = 0; //存储结果
	while(x--) ans += (run(x) ? 366 : 365); //求年份总天数
	while(y--) ans += d[y]; //求月份总天数
	ans += z; //加上天数
	return ans;
}

int main( ) {
	int x,y,z;
	cin >> x >> y >> z;
	cout << day(x,y,z);
	return 0;
}

四、日期回文数

思路:我们只要枚举日期的后四位,整个日期便可以推出来,比如后四位是 1201
 那整个日期就应该是 1021+1201=10211201,然后判断此日期是否满足条件即。

#include <iostream>
using namespace std;
const int days[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main() {
	int l,r, ans = 0;
	cin >> l >> r;
	for (int i = 1; i <= 12; i ++) {
		for (int j = 1; j <= days[i]; j ++) {
			int c = i * 100 + j;
			c = c % 10 * 10000000 + c / 10 % 10 * 1000000 + c / 100 % 10 * 100000 + c / 1000 * 10000 + c;
			if (c >= l && c <= r) ans++;
		}
	}
	cout << ans;
	return 0;
}

五、枚举203.10.11-2024.01.01 的相关方法

#include<bits/stdc++.h>
using namespace std;

int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//从d[1]开始存

bool run(int x) {
	if((x % 4 == 0 && x % 100 != 0 )|| x % 400 == 0)
		return true;
	return false;
}

int main() {
	int l,r;
	cin >> l >> r;
	for(int i = l/10000; i <= r/10000; i++) {
		for(int j = 1; j <= 12; j++) {
			if(j == 2 && run(i)) d[2] = 29;
			else d[2] = 28;
			for(int k = 1; k <= d[j]; k++){
				int s = i *10000 + j * 100 + k;
				cout << s << endl;
			}
		}
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值