日期问题
查看原帖
日期问题
671223
OAIM楼主2024/1/4 12:28

求大神帮忙调一下代码呗,这个代码本地测试没测出问题,但是一提交就出错了,测试用例一个都过不了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;
} 
2024/1/4 12:28
加载中...