常见的日期计算问题(模板)

1.判断日期的合法性

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组 
// 1.判断日期合法性 
//1111 22 11
bool check(int data){
	int year=data/10000; 
	int month=data%10000/100;
	int day=data%100;
	//判断月份 
	if(month<=0||month>=13) return false;
	//判断天,特判2月份 
	if(day==0|| month!=2&&day>months[month]) return false;
	if(month==2){  //闰年,则为29天 
		int leap=(year%4==0&&year%100!=0)||year%400==0;
		if(day>28+leap) return false;
	}
	return true;
}

2.得到某年某月的天数

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组 
int get(int year,int month){
	if(month!=2) return months[month]; //判断是否为2月 
	else {
		int leap = (year%4==0&&year%100!=0)|| year%400==0;
			return 28+leap;
	}
} 

3.判断两个日期之间有多少回文数(前提日期合法)

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组 
bool check(int data){
	int year=data/10000;
	int month=data%10000/100;
	int day=data%100;
	//判断月份 
	if(month<=0||month>=13) return false;
	//判断天,特判2月份 
	if(day==0|| month!=2&&day>months[month]) return false;
	if(month==2){  //闰年,则为29天 
		int leap=(year%4==0&&year%100!=0)||year%400==0;
		if(day>28+leap) return false;
	}
	return true;
}
int get(int data1,int data2,int k){
	int ans=0;
	for(int i=1000;i<10000;i++){
		int data=i,x=i;
		for(int j=0;j<4;j++)
			data=data*10+x%10;  //构造回文日期 
		if(data1<=data&&data<=data2&&check(data))//判断回文日期 
			ans++;		
	}
	return ans;
}

4.给定年月日,经过n天对应的日期

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组 
int get(int year,int month){
	if(month!=2) return months[month]; //判断是否为2月 
	else {
		int leap = (year%4==0&&year%100!=0)|| year%400==0;
			return 28+leap;
	}
} 
void pass(int y,int m,int d,int n){
	while(n--){
		d++;
		if(d>get(y,m)) m++,d=1; //当天数大于当月天数,m+1 
		if(m>12) y++,m=1;
	}
	printf("%d-%02d-%02d\n",y,m,d);
} 

5.计算天数

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //建立月份数组 
//  5.计算两个日期之间需要锻炼多久(星期一,每月第一天 2km),其他1km
//计算 2000-01-01(星期六) 到 2020-10-1(星期四) 锻炼路程  
int sum(){
	int ans=0;
	int d=6;    
	int mon;
	for(int year=2000;year<=2020;year++){ //遍历年份 
		if(year%400==0||(year%4==0&&year%100!=0))//判断是否是闰年 
			months[2]=29;
		else 
			months[2]=28;
		if(year==2020) mon=9;//判断是否是2020年 
		else    mon=12;
		for(int m=1;m<=mon;m++){//遍历月份 
			for(int j=1;j<=months[m];j++){ //遍历天数 
				if(j==1||d==1){
					ans++;	
				}
				d++;
				ans++;
				d=d%7;
			}
		}
	}
	return ans+2;//加上2020-10-01 
}

例题

1.回文日期(检查日期的合法性)

链接:回文日期
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool check(int data){
	int year=data/10000;
	int month=data%10000/100;
	int day=data%100;
	//判断月份 
	if(month<=0||month>=13) return false;
	//判断天,特判2月份 
	if(day==0|| month!=2&&day>months[month]) return false;
	if(month==2){  //闰年,则为29天 
		int leap=(year%4==0&&year%100!=0)||year%400==0;
		if(day>28+leap) return false;
	}
	return true;
}

int ans;
int main(){
	int data1,data2;
	cin>>data1>>data2;
	for(int i=1000;i<10000;i++){
		int data=i,x=i;
		for(int j=0;j<4;j++)
			data=data*10+x%10,x=x/10;//构造回文日期 
		if(data>=data1&&data<=data2&&check(data)) ans++;
	}
	cout<<ans<<endl; 
	return 0;
}

2.日期问题(检查日期合法性)

链接:日期问题
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};


bool check(int year ,int month,int day){ //判断日期是否合法 
	if(month<=0||month>=13) return false;
	if(day==0||(month!=2&&day>months[month])) return false;
	if(month==2){
		int leap=(year%400==0)||(year%4==0&&year%100!=0);
		if(day>leap+28) return false;
	}
	return true;
}

int main(){
	int a,b,c;
	scanf("%d/%d/%d",&a,&b,&c);
	for(int i=19600101;i<=20591231;i++){  
		int year=i/10000,month=i%10000/100,day=i%100;
		if(check(year,month,day)){
			//判断是否满足条件 
			if(year%100==a&&month%100==b&&day%100==c||
			month%100==a&&day%100==b&&year%100==c||
			day%100==a&&month%100==b&&year%100==c
			)
			printf("%d-%02d-%02d\n",year,month,day);	
		}	
	} 
	return 0;
}

3.回文日期(检查合法性+判断回文)

链接:回文日期
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;


int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};


bool check_vaild(int data){ //检查合法性 
	int year=data/10000,month=data%10000/100,day=data%100;
	if(month<=0||month>=13) return false;
	if(day==0||(month!=2&&day>months[month])) return false;
	if(month==2){
		int leap=(year%400==0) ||(year%4==0&&year%100!=0);
		if(day>28+leap) return false;
	}
	return true;
}

bool p1,p2;
int ans1,ans2;//记录两个日期 
bool  check_huiwen(int data){ //判断回文 
	int year=data/10000;
	int month=data%10000/100;
	int day=data%100;
	if(month%10==day/10) return false;
	if(month/10==day/10&&month%10==day%10) return true;
	return false;
}

int main(){
	int data;
	cin>>data;
	int year=data/10000;
	
	while(1){
		int new_data=year,x=year;
		for(int i=0;i<4;i++) //构造回文日期 
			new_data=new_data*10+x%10,x=x/10;
		if(new_data==data){
			year++;
			continue;
		}
		if(check_vaild(new_data)){  //检查合法性 
			if(!p1) p1=true,ans1=new_data;
			if(!p2&&check_huiwen(new_data)) p2=true,ans2=new_data;
		}
		year++;
		if(p1&&p2) break;  //找到两个日期,则退出while		
	}
	cout<<ans1<<endl<<ans2<<endl;
}

4.日期计算(计算是多少天+判断每月的天数)

链接:日期计算
在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断每月为几天 
int get(int year,int month){
	if(month!=2) return months[month];
	else {
		int leap=(year%400==0)||(year%4==0&&year%100!=0);
		return leap+28;
	}	
}
//计算某年的第n天 
void pass(int y,int m,int d,int n){
	while(n--){
		d++;
		if(d>get(y,m)) m++,d=1;
		if(m>12) y++,m=1;
	}
	printf("%d\n%d\n",m,d);
}

int main(){
	int y,n;
	cin>>y>>n;
	int m=1,d=0;
	pass(y,1,d,n);
	return 0;
}

5.跑步锻炼(计算天数)

在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;
int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int sum(){
	int ans=0;
	int d=6;    
	int mon;
	for(int year=2000;year<=2020;year++){ //遍历年份 
		if(year%400==0||(year%4==0&&year%100!=0))//判断是否是闰年 
			months[2]=29;
		else 
			months[2]=28;
		if(year==2020) mon=9;//判断是否是2020年 
		else    mon=12;
		for(int m=1;m<=mon;m++){//遍历月份 
			for(int j=1;j<=months[m];j++){ //遍历天数 
				if(j==1||d==1){
					ans++;	
				}
				d++;
				ans++;
				d=d%7;
			}
		}
	}
	return ans+2;//加上2020-10-01 
}

int main(){
	cout<<sum()<<endl; 
	return 0;
}

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ江晚吟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值