P8651日期问题

本文介绍了如何使用C++编程解决洛谷题目中的日期问题,包括检查日期合法性、输出不同格式的日期以及保证日期顺序的逻辑。代码涉及输入排序、闰年判断和日期格式转换。
摘要由CSDN通过智能技术生成

P8651日期问题

题目

洛谷题目链接

分析

假设日期年月日为a、b、c

  • 注意各个数字的范围:a>=1960,a<2060,b>=1,b<=12,c>=1
  • 读入的数据可能是年/月/日月/日/年日/月/年
  • 区分闰年时二月份的不同
  • 相同的日期不能重复输出
  • 有多种结果时,日期从早到晚排列
  • 输入的年份只有后半部分,若要实现顺序排列最好的办法是在输入时将前缀加上。比较年、月谁在先后。

代码主要解决的问题分为三部分:
输出函数:控制输出年/月/日月/日/年日/月/年,用于随时调用保证日期的顺序性
检查函数:检查日期的合法性
主函数:做输入以及主逻辑的内容(不要忘记了判重)

代码

#include<bits/stdc++.h>
using namespace std;

int a,b,c;
bool check(int a,int b,int c){
	
	if(c<=0)return 0;
	//大月
	if(b==1 || b==3 || b==5 || b==7 || b==8 || b==10 || b==12){
		if(c<=31)return 1;
	}
	if(b==4 || b == 6 || b== 9 || b == 11){
		if(c<=30)return 1;
	}
	if(b == 2){
		if(a%4 == 0){
			if(c<=29)return 1;
		}else{
			if(c<=28)return 1;
		}
	}
	return 0;
}
void print_ans(int n){
	switch (n) {
	
	case 1:
		//年/月/日
		if(check(a,b,c))printf("%d%02d-%02d-%02d\n",a>=60?19:20,a,b,c);
		break;
	
	case 2:
		//月/日/年
		if(check(c,a,b))printf("%d%02d-%02d-%02d\n",c>=60?19:20,c,a,b);
		break;
		
	case 3:
		//日/月/年
		if(check(c,b,a))printf("%d%02d-%02d-%02d\n",a>=60?19:20,c,b,a);
		break;
	}
}
int main(){

	scanf("%d/%d/%d",&a,&b,&c);;
	
	if(a<60)a+=100;
	if(c<60)c+=100;//更改大小,便于比较
	
	if(a<c){//a比c年份大
		a %= 100;
		c %= 100;//还原
		print_ans(1);//a年份小,先输出
		
		//再输入年份大的c,先比较ab,小的作为月份。
		if(a<b){
			if(c!=a || a!=b || b!=c){//如果三个互不相等,则可以输出
				print_ans(2);
				if(b!=a)print_ans(3);//再判断月日是否相等
			}
			
		}else{
			if(c!=a){
				print_ans(3);
				if(b!=a)print_ans(2);//再判断月日是否相等
			}
		}
	}else{//c比a年份大
		a %= 100;
		c %= 100;//还原
		
		//再输入年份大的c,先比较ab,小的作为月份。
		if(a<b){
			if(c!=a || a!=b || b!=c){//如果三个互不相等,则可以输出
				print_ans(2);
				if(b!=a)print_ans(3);//再判断月日是否相等
			}
			
		}else{
			if(c!=a){
				print_ans(3);
				if(b!=a)print_ans(2);//再判断月日是否相等
			}
		}
		
		print_ans(1);//最后输出a
	}
	
	return 0;	
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值