求大神帮忙调一下代码呗,这个代码本地测试没测出问题,但是一提交就出错了,测试用例一个都过不了o(╥﹏╥)o
//日期问题
//年份:00-99
//月份:01-12
//日:01-28/29/30/31
//多个日期按从早到晚排列
//年份无须判断,都可以
//月份可以的日也一定可以
//从日开始,再判断月(年月日还需结合判断)
//注意重复日期!!!
#include<iostream>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX_LENGTH 8
//判断日期合理性
bool IsValid(int &year,int month,int day){
//日期应小于等于12,月份应小于等于31
if(month > 12 || month < 1 || day > 31 || day < 1){
return false;
}
//将年份修改为四位的
if(year <= 59){
year += 2000;
}else{
year += 1900;
}
//判断除了2月份外的其他月份是否正确
if(month == 4 || month == 6 || month == 9 || month == 11){
if(day > 30){
return false;
}
}
//判断是否是闰年
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
//是闰年
if(month == 2){
if(day > 29){
return false;
}
}
}else{
//不是闰年
if(month == 2){
if(day > 28){
return false;
}
}
}
return true;
}
//将数字转换为字符串
void TransferToString(char c[],int num){
//c = to_string(num);
if(num / 10 > 0){
snprintf(c,5,"%d",num);
}else{
snprintf(c,3,"0%d",num);
}
}
//拼接日期
void PutTogether(string &s,char y[],char m[],char d[]){
//sprintf(s,"%s-%s-%s",c_str(y),c_str(m),c_str(d));
//清空字符串
s.clear();
//拼接字符串
/*strcat(&s[0],y);
strcat(&s[0],"-");
strcat(&s[0],m);
strcat(&s[0],"-");
strcat(&s[0],d);*/
s.append(y);
s.append("-");
s.append(m);
s.append("-");
s.append(d);
//cout << s << endl;
}
//从早到晚排序
void Sort(vector<string> &date){
string temp;
//选择排序法
/*for(int i = 0;i < date.size() - 1;i++){
for(int j = i;j < date.size();j++){
if(date[i] > date[j]){
temp = date[j];
date[j] = date[i];
date[i] = temp;
}
}
}*/
sort(date.begin(),date.end());
//去除重复的元素
auto last = unique(date.begin(),date.end());
date.erase(last,date.end());
}
//输出可能的日期组合
void Output(vector<string> &date){
for(int i = 0;i < date.size();i++){
cout << date[i] << endl;
}
}
//推断可能的日期组合并输出
void Infer(int aa,int bb,int cc){
vector<string> date;
int year,month,day;//年月日
char y[4],m[2],d[2];//年月日
bool isValid;//日期是否合理
string s;//拼接后的日期
//先推理出可以的6种组合
//再判断6种组合的合理性
year = aa;
if(year == aa){
month = bb;
if(month == bb){
day = cc;
//判断日期合理性
isValid = IsValid(year,month,day);
if(isValid){
//是合理的
//将数字转换为字符串
TransferToString(y,year);
TransferToString(m,month);
TransferToString(d,day);
//cout << y << "/" << m << "/" << d;
//拼接日期
PutTogether(s,y,m,d);
//向容器中添加元素
date.push_back(s);
//printf("%d/%d/%d",year,month,day);
}
}
}
year = cc;
if(year == cc){
month = aa;
if(month == aa){
day = bb;
isValid = IsValid(year,month,day);
//printf("%d/%d/%d\n",year,month,day);
if(isValid){
//是合理的
//将数字转换为字符串
TransferToString(y,year);
TransferToString(m,month);
TransferToString(d,day);
//拼接日期
PutTogether(s,y,m,d);
//向容器中添加元素
date.push_back(s);
}
}
month = bb;
if(month == bb){
year = cc;
day = aa;
isValid = IsValid(year,month,day);
if(isValid){
//是合理的
//将数字转换为字符串
TransferToString(y,year);
TransferToString(m,month);
TransferToString(d,day);
//拼接日期
PutTogether(s,y,m,d);
//向容器中添加元素
date.push_back(s);
}
}
}
//给合理的日期按从早到晚排序
Sort(date);
//输出可能的日期组合
Output(date);
}
int main(){
//推断可能的日期并输出
int aa,bb,cc;//三位数字
scanf("%d/%d/%d",&aa,&bb,&cc);
//推断可能的日期并输出
Infer(aa,bb,cc);
return 0;
}