1229. 日期问题(模拟)

 

一串数字一次想象成年/月/日  月/日/年  日/月/年形式

找到符合条件的情况,排序,去重

1.究极模拟

//纯纯模拟
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
struct DATA
{
	int year;
	int month;
	int day;
	friend bool const operator <(DATA a, DATA b)
	{
		if (a.year < b.year) return true;
		else if (a.year == b.year)
		{
			if (a.month < b.month)
				return true;
			else if (a.month == b.month)
			{
				if (a.day < b.month)
					return true;
			}
		}
		return false;
	}

	friend bool const operator ==(DATA a, DATA b)
	{
		if (a.year == b.year && a.month == b.month && a.day == b.day)
			return true;
		return false;
	}
}d[3];
int cnt;
bool real(int year, int month, int days)
{
	if (month == 0 || month > 12||days==0) return false;
	
	if (month != 2 && days > a[month]) return false;

	if (month == 2)
	{
		if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
		{//闰年
			if (days > a[month] + 1) return false;
			else return true;
		}
		else if (days > a[month]) return false;
	}
	return true;
}
int main()
{
	string s;
	cin >> s;
	int year = 0, day = 0, month = 0;
	//年月日
	for (int i = 0;i < 2;i++)
		year = year * 10 + s[i] - '0';
	for (int j = 3;j < 5;j++)
		month = month * 10 + s[j] - '0';
	for (int z = 6;z < 8;z++)
		day = day * 10 + s[z] - '0';
	
	if (year >= 60)
		year += 1900;
	else
		year += 2000;int data = year * 10000 + month * 100 + day;
	if (data >= 19600101 && data <= 20591231)
	{
		
		if (real(year, month, day))	//真实存在
			d[cnt++] = { year,month,day };
	}
	//月日年
	year = month = day = data = 0;
	for (int i = 6;i < 8;i++)
		year = year * 10 + s[i] - '0';
	for (int j = 0;j < 2;j++)
		month = month * 10 + s[j] - '0';
	for (int z = 3;z < 5;z++)
		day = day * 10 + s[z] - '0';
	 
	 if (year >= 60)
		 year += 1900;
	 else
		 year += 2000;data = year * 10000 + month * 100 + day;
	if (data >= 19600101 && data <= 20591231)
	{
		
		if (real(year, month, day))	//真实存在
			d[cnt++] = { year,month,day };
	}
	//日月年
	month = year = data = day = 0;
	for (int i = 6;i < 8;i++)
		year = year * 10 + s[i] - '0';
	for (int j = 3;j < 5;j++)
		month = month * 10 + s[j] - '0';
	for (int z = 0;z < 2;z++)
		day = day * 10 + s[z] - '0';
	if (year >= 60)
		year += 1900;
	else
		year += 2000;
	 data = year * 10000 + month * 100 + day;
	if (data >= 19600101 && data <= 20591231)
	{
		
		if (real(year, month, day))	//真实存在
			d[cnt++] = { year,month,day };
	}
	//输出
	int a[] = { 1,2,3,3 };
	sort(d, d + cnt);
	
	for (int i = 0;i <cnt;i++)
	{
		if (i>0&&d[i] < d[i-1]||d[i]==d[i-1])
			continue;
		printf("%d-%02d-%02d\n", d[i].year, d[i].month, d[i].day);
	}
}

2.改装版

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

struct DATA
{
	int year;
	int month;
	int day;
	friend bool const operator <(DATA a, DATA b)
	{
		if (a.year < b.year) return true;
		else if(a.year==b.year)
		{
			if (a.month < b.month)
				return true;
			if (a.month == b.month)
				return a.day < b.day ? true : false;
		}
		return false;
	}
	friend bool const operator ==(DATA a, DATA b)
	{
		if (a.year == b.year && a.month == b.month && a.day == b.day)
			return true;
		return false;
	}
}d[3];
int cnt = 0;
bool real(int year, int month, int days)	//判断日期
{
	if (month == 0 || month > 12||days==0) return false;
	
	if (month != 2 && days > a[month]) return false;

	if (month == 2)
	{
		if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
		{//闰年
			if (days > a[month] + 1) return false;
			else return true;
		}
		else if (days > a[month]) return false;
	}
	return true;
}
int check (int a, int b, int c)
{//年,月,日
	if (a >= 60) a += 1900;
	else a += 2000;	//变成年份
	
	if (real(a, b, c))	//真实存在
	{
		d[cnt++] = { a,b,c };
		return true;
	}
	return false;
}
int main()
{
	//输入特别的可以运用scanf的性质
	int a, b, c;
	
	scanf_s("%d/%d/%d", &a, &b, &c);
	check(a, b, c);		//年月日

	check(c, a, b);

	check(c, b, a);
	
	sort(d, d + cnt);
	for (int i = 0;i < cnt;i++)
	{
		if (i > 0 && d[i] == d[i - 1])
			continue;
		printf("%d-%02d-%02d",d[i].year,d[i].month,d[i].day);
	}
}

3.Y总的做法

#include <iostream>
#include <algorithm>
using namespace std;
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
bool real(int year, int month, int days)	//判断日期
{
	if (month == 0 || month > 12 || days == 0) return false;

	if (month != 2 && days > a[month]) return false;

	if (month == 2)
	{
		if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
		{//闰年
			if (days > a[month] + 1) return false;
			else return true;
		}
		else if (days > a[month]) return false;
	}
	return true;
}
int main()
{
	int a, b, c;
	scanf_s("%d/%d/%d", &a, &b, &c);
	for (int i = 19600101;i <= 20591231;i++)
	{//直接枚举所有年份,不会有重复年份
		int year = i / 10000;
		int month = i % 10000 / 100;
		int day = i % 100;
		if (real(year, month, day))
		{
			if (year % 100 == a && month == b && day == c ||		//年月日
				year % 100 == c && month == b && day == a ||			//日月年
				year % 100 == c && month == a && day == b			//年月日
				)
				printf("%d-%02d-%02d\n", year, month, day);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值