专题03 时间问题

时间问题
1.《算法设计》例题:手动输入两个日期并判断两者相差多少天

//日期:都有一个从小日期数到大日期的过程(计数器)
//如果有输入日期为字符串 要多一步字符串处理过程 
#include<iostream>

using namespace std;

//1.定义一个维数组来存储每月天数(左平 右闰)日期问题必备1 
int month[13][2]={
	{0,0},  //0(符合数组下标的习惯 无实际意义)
	{31,31},//1 两个元素对应数组下标:month[1][0] / month[1][1] 
	{28,29},//2
	{31,31},//3
	{30,30},//4
	{31,31},//5
	{30,30},//6
	{31,31},//7
	{31,31},//8
	{30,30},//9
	{31,31},//10
	{30,30},//11
	{31,31} //12月 
};

//2.判断是否为闰年的函数 日期问题必备2
bool isYeap(int year){
	if(year%4==0 && year%100!=0 || year%400==0){
		return true;
	}else{
		return false;
	}
} 

int main(){
	//3.保证t1是小日期(输入格式:20200422) 
	int t1,t2;   
	cin>>t1>>t2;
	if(t1>t2){ 
		int t=t1;
		t1=t2;
		t2=t1;
	}
	
	//分别得到两个日期的年月日 
	int y1,m1,d1;
	int y2,m2,d2; 
	y1=t1/10000,m1=t1%10000/100,d1=t1%100;
	y2=t2/10000,m2=t2%10000/100,d2=t2%100;
	
	//***4.具体计算两个日期差多少天*** (核心) 
	int count=1;
	while((y1!=y2)||(m1!=m2)||(d1!=d2)){
		count++;
		d1++;
		if(d1==month[m1][isYeap(y1)+1]){ //这一个月满了 号数回到1 月数++ 
			d1=1;
			m1++;
		}
		else if(m1==13){                //这一年满了    月数回到1 年数++    
			m1=1;
			y1++;
		} 
	}
	cout<<count<<endl;
	return 0;
} 

2.201509-2:判断2020年的第68天是几月几号

#include<iostream>

using namespace std;

//1.日期问题必备1:判断平 or 闰年 
int isYeap(int y){
	if((y%4==0 && y%100!=0)|| y%400==0){
		return 0;   //return true返回的是0   
	}else{
		return -1;  //return false返回的是-1 
	}
}

int main(){
	//2.日期问题必备2:每月天数(2行13列的二维数组) 
	int month[2][13]={
		{0,31,28,31,30,31,30,31,31,30,31,30,31},
		{0,31,29,31,30,31,30,31,31,30,31,30,31} 
    };
    
    //3.日期问题核心:计算日期差
	int y,d,count=0,m=1,s=0;
	cin>>y>>d;
	while(count!=d){
		count++;
		s++;
		if(s>month[isYeap(y)+1][m]){ //这一个月满了 号数回到1 月数++ 
			s=1;
			m++;
		}
		else{ 
			s=s;
			m=m;
		}
	}
	cout<<m<<endl<<s<<endl; 
	
	return 0;
} 

3.201503-3:判断2020年的第5个星期天是几月几号

#include<iostream>

using namespace std;

int isYeap(int y){
	if((y%4==0 && y%100!=0) || y%400==0){
		return 0;
	}else{
		return -1;
	}
}

int month[2][13]={
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}
};

int main(){
	int a,b,c,y1,y2;
	cin>>a>>b>>c>>y1>>y2;
	
	int y=1850,m=1,d=0,wed=2,count=0;//1850年作为参考年份 
	
	                                 //输出[y1,y2]间每一年的日期 
	for(int i=y1 ; i<y2+1 ; i++){
		                             //1.首先得到y/a/01所对应的wed(从1850年开始计算) 
		while((y!=i) || (m!=a)){
			wed++; 
			d++;
			if(d>month[isYeap(y)+1][m]){
				d=1;
				m++;
			}
			if(m==13){
				m=1;
				y++;
			}
			if(wed>7){
				wed=1;
			}
		
	    } 
		                              //2.然后根据wed、b、c三者之间关系  得到所求的day
		while(count!= b){
			d++;
			if(wed==c){
				count++;
			}else{
				count=count;
			}
			
			wed++;
			if(wed>7){
				wed=1;
			}else{
				wed=wed;
			}
		}
		                            //3.输出格式要求 
		if(a<9){
			cout<<i<<"/0"<<a;
			if(d<9){
				cout<<"/0"<<d;
			}else{
				cout<<"/"<<d;
			}
		}
		else{
			cout<<i<<"/"<<a;
			if(d<9){
				cout<<"/0"<<d;
			}else{
				cout<<"/"<<d;
			}
		}
		                           //这里要注意哈 
	    y=i;
	    count=0;
		cout<<endl; 
	} 
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值