一串数字一次想象成年/月/日 月/日/年 日/月/年形式
找到符合条件的情况,排序,去重
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);
}
}
}