思路
枚举每个输入可能组成的天数 判断哪个满足条件 输出哪个
C++ 代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int months[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //存每月份天数
int a[3]; //存输入的年-月-日
char c;//存 /
typedef struct{
int y,m,d;
}day; //存满足条件的年月日 因为要求从小到大输出 存完排个序在输出
day d1[100];
int cnt;
int is_leap(int y){ //判断是否为闰年
if(y %400 == 0 || y % 4 == 0 && y %100 != 0) return 1;
return 0;
}
int get_month_days(int y, int m){ //求当前年 当前月的天数
int res = months[m];
if(m == 2) res += is_leap(y);
return res;
}
int get_total_days(int y, int m, int d){ //求从1开始到 当前年 当前月 当前天 一共的天数
int res = 0;
for(int i = 1; i < y; i++) res += 365 + is_leap(i);
for(int i = 1; i < m; i++) res += get_month_days(y,i);
return res + d;
}
bool check(int y, int m, int d){ //检查是否满足题意
if(m < 1 || m > 12) return false; //检查月份是否满足
if(d < 1 || get_month_days(y,m) < d) return false; //判断天数是否满足
if(get_total_days(y,m,d) < get_total_days(1960, 1,1) || //判断是否处于题意的日期之间
get_total_days(y,m,d) > get_total_days(2059,12,31)) return false;
return true;
}
bool cmp(day t1, day t2){ //结构体 排序规则
return get_total_days(t1.y , t1.m , t1.d) < get_total_days(t2.y , t2.m , t2.d);
}
int main(){
cin >> a[0] >> c >> a[1] >> c >> a[2];
int y = 1900 + a[0];
int m = a[1];
int d = a[2];
if(check(y,m,d)) d1[cnt++] = {y,m,d};
y = 1900 + a[2];
m = a[0];
d = a[1];
if(check(y,m,d)) d1[cnt++] = {y,m,d};
y = 1900 + a[2];
m = a[1];
d = a[0];
if(check(y,m,d)) d1[cnt++] = {y,m,d};
y = 2000 + a[0];
m = a[1];
d = a[2];
if(check(y,m,d)) d1[cnt++] = {y,m,d};
y = 2000 + a[2];
m = a[0];
d = a[1];
if(check(y,m,d)) d1[cnt++] = {y,m,d};
y = 2000 + a[2];
m = a[1];
d = a[0];
if(check(y,m,d)) d1[cnt++] = {y,m,d};
sort(d1,d1+cnt,cmp);
printf("%04d-%02d-%02d\n",d1[0].y ,d1[0].m ,d1[0].d);
for(int i = 1; i < cnt; i++)
if(get_total_days(d1[i].y , d1[i].m , d1[i].d ) != get_total_days(d1[i-1].y , d1[i-1].m , d1[i-1].d )) //不能重复
printf("%04d-%02d-%02d\n",d1[i].y ,d1[i].m ,d1[i].d);
return 0;
}
算法2
C++ 代码
/*
y总思路 枚举从1960年1月1日至2059年12月31日之间的所有日期, 挨个检查是否满足条件
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int months[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int a, b,c;
int is_leap(int y){
if(y%400 == 0 || y%4== 0 && y%100) return 1;
return 0;
}
bool check(int y, int m ,int d){
if(m < 1 || m > 12) return false;
if(d < 1) return false;
if(m == 2){
if(d > (months[m] + is_leap(y))) return false;
}else{
if(d > months[m]) return false;
}
return true;
}
int main(){
scanf("%d/%d/%d", &a, &b,&c);
for(int date = 19600101; date <= 20591231; date++){
int y = date/10000, m = date%10000/100, d = date%100;
if(check(y,m,d)){
if(y%100 == a && m == b && d == c || y%100 == c && m == a && d == b || y %100 == c && m == b && d == a)
printf("%d-%02d-%02d\n",y,m,d);
}
}
return 0;
}