小言_互联网的博客

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

336人阅读  评论(0)

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;
}


转载:https://blog.csdn.net/m0_46549425/article/details/115445821
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场