日期的算法格式化

问题描述

小明在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在1960年1月1日至2059年12月31日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月年的。更麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在有很多的可能的日期月其对应。
比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对应吗?

输入

一个日期,格式是"AA/BB/CC"。(0 <= A,B,C <= 9)

输出

输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期从早到晚排列。

样例输入

02/03/04

样例输出

2002-03-04
2004-02-03
2004-03-02

代码

#include <stdio.h>
#include <string>
#include <set>
#include <iostream>
string to_string(int num)
{
	char buf[10];
	sprintf(buf, "02%d", num);
	string res = (string)buf; //char转string可直接强制转换
	return ans;
}
int getDayNum(int YY, int MM)//若求日是否符合要求,必先求出年份及月份以其作为参数
{
	int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//月份数组
	if((YY % 4 == 0 && YY % 100 != 0) || YY % 400 == 0)//判断瑞年的条件
		m[1] = 29;
	return m[MM-1];//返回天数
}
string ifOK(int year, int mouth, int data)
{
	int y;
	string ans;
	//判断年份是否符合要求
	if(year >= 60){
		y =1900 + year;
		/*在c++11后可直接使用string库中的to_string(int num)
		将int转换为string*/
		ans += "19" + to_string(year) + "-";
	}
	else{
		y = 2000 + year;
		ans += "20" + to_string(year) + "-";
	}
	//判断月份是否符合要求
	if(mouth >= 1 && mouth <= 12)
		ans += to_string(mouth) + "-";
	else
		return "";
	//判断日是否符合要求
	if(data >= 1 && data <= getDayNum(y, mouth))
		ans += to_string(data);
	else
		return "";
	
	return ans;
}
int main()
{
	int AA, BB, CC;
	scanf("%d\%d\%d", &AA, &BB, &CC);
	set<string> s;
	string str;
	
	str = ifOK(AA, BB, CC);
	if(str.length() > 0)
		s.insert(str);
		
	str = ifOK(BB, CC, AA);
	if(str.length() > 0)
		s.insert(str);

	str = ifOK(CC, BB, AA);
	if(str.length() > 0)
		s.insert(str);

	for(auto it = s.begin(); it != s.end(); it++)
		cout << *it << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值