对于输入的abc我们可以以a为年也可以以c为年,将abc,cab,cba这三种情况进行判断合法性即可,注意需要排序去重,所以考虑使用set
此处为纯模拟的写法,但使用循环代码会更加简洁。
方法一:
#include
using namespace std;
const int N = 2e5 + 10;
set st;
string s[N];
int cnt;
int m[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool is_ren(int x)
{
if((x % 4 == 0 && x % 100 != 0)||(x % 400 == 0))return true;
return false;
}
int main()
{
int a, b, c;
scanf("%d/%d/%d",&a, &b, &c);
//以a为年 //abc
if(a <= 59)
{
//abc
if(b <= 12 && b > 0)
{
int x = 2000 + a;
if(is_ren(x))m[2] = 29;
else m[2] = 28;
if(c <= m[b] && c > 0)
{
cnt ++;
s[cnt] = "20";
if(a < 10)s[cnt] += "0";
s[cnt] += (to_string(a) + "-" );
if(b < 10)s[cnt] += "0";
s[cnt] += (to_string (b) + "-");
if(c < 10)s[cnt] +="0";
s[cnt] += to_string(c);
st.insert(s[cnt]);
}
}
}
else if(a > 59)
{
//abc
if(b <= 12 && b > 0)
{
int x = 1900 + a;
if(is_ren(x))m[2] = 29;
else m[2] = 28;
if(c <= m[b] && c > 0)
{
cnt ++;
s[cnt] = "19";
if(a < 10)s[cnt] += "0";
s[cnt] += to_string(a) + "-" ;
if(b < 10)s[cnt] += "0";
s[cnt] += to_string (b) + "-";
if(c < 10)s[cnt] +="0";
s[cnt] += to_string(c);
st.insert(s[cnt]);
}
}
}
//以c为年 //cab, cba
if(c <= 59)
{
//cab
if(a <= 12 && a > 0)
{
int x = 2000 + c;
if(is_ren(x))m[2] = 29;
else m[2] = 28;
if(b <= m[a] && b > 0)
{
s[++ cnt] = "20";
if(c < 10)s[cnt] += "0";
s[cnt] += to_string(c) + "-" ;
if(a < 10)s[cnt] += "0";
s[cnt] += to_string (a) + "-";
if(b < 10)s[cnt] +="0";
s[cnt] += to_string(b);
st.insert(s[cnt]);
}
}
//cba
if(b <= 12 && b > 0)
{
int x = 2000 + c;
if(is_ren(x))m[2] = 29;
else m[2] = 28;
if(a <= m[b] && a > 0)
{
cnt ++;
s[cnt] = "20";
if(c < 10)s[cnt] += "0";
s[cnt] += to_string(c) + "-" ;
if(b < 10)s[cnt] += "0";
s[cnt] += to_string (b) + "-";
if(a < 10)s[cnt] +="0";
s[cnt] += to_string(a);
st.insert(s[cnt]);
}
}
}
else if(c > 59)
{
//cab
if(a <= 12 && a > 0)
{
int x = 1900 + c;
if(is_ren(x))m[2] = 29;
else m[2] = 28;
if(b <= m[a] && b > 0)
{
cnt ++;
s[cnt] = "19";
if(c < 10)s[cnt] += "0";
s[cnt] += to_string(c) + "-" ;
if(a < 10)s[cnt] += "0";
s[cnt] += to_string (a) + "-";
if(b < 10)s[cnt] +="0";
s[cnt] += to_string(b);
st.insert(s[cnt]);
}
}
//cba
if(b <= 12 && b > 0)
{
int x = 1900 + c;
if(is_ren(x))m[2] = 29;
else m[2] = 28;
if(a <= m[b] && a > 0)
{
cnt ++;
s[cnt] = "20";
if(c < 10)s[cnt] += "0";
s[cnt] += to_string(c) + "-" ;
if(b < 10)s[cnt] += "0";
s[cnt] += to_string (b) + "-";
if(a < 10)s[cnt] +="0";
s[cnt] += to_string(a);
st.insert(s[cnt]);
}
}
}
for(auto i : st)
{
cout << i << '\n';
}
return 0;
}
方法二:
#include
using namespace std;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check_valid(int year, int month, int day)
{
if(month == 0 || month > 12)return false;
if(day == 0)return false;
if(month != 2)
{
if(day > days[month])return false;
}
else
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if(day > 28 + leap)return false;
}
return true;
}
int main()
{
int a, b, c;
scanf("%d/%d/%d", &a, &b, &c);
for(int date = 19600101; date <= 20591231; date ++)
{
int year = date / 10000, month = date % 10000 / 100, day = date % 100;
if(check_valid(year, month, day))
{
if(year % 100 == a && month == b && day == c ||
month == a && day == b && year % 100 == c ||
day == a && month == b && year % 100 == c)
printf("%d-%02d-%02d\n", year, month, day);
}
}
return 0;
}