日期差值(上交机试)

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天

输入描述

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出描述

每组数据输出一行,即日期差值

输入样例

20110412
20110422

输出样例

11

分析:本题需要考虑三种情况:①同年(同月否?)计算②最后一年计算(同月否?)③中间间隔的完整年份的计算

在解题时为方便字符串与数字之间的转换,本人用到了STL库的stoi函数将字符串快速转换成整数,在这里详细介绍一下相关的几个函数:
①atoi函数
atoi()参数是 const char* 类型的,因此可以将一个字符数组转换成一个数字。但是如果将一个string类型的字符串转换成数字的话,这时我们需要先调用string类成员方法**.c_str()*将其转换为const char 类型后,再进行转换。

cout<<atoi(a.c_str());

②stoi函数
stoi()参数是 const string& 类型的,因此可以将一个string类型的字符串转换成一个数字。
PS:stoi()会做范围检查,默认范围在int范围内(因为返回的是int类型),如果超出范围的话则会runtime error!
atoi()则不会做范围检查,如果超出范围的话,超出上界,则输出上界,超出下界,则输出下界。请看代码:

代码如下:

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
int main(){
	string date1,date2;
	cin>>date1>>date2;
	int y1 = stoi(date1.substr(0,4)); 
	int m1 = stoi(date1.substr(4,2)); 
	int d1 = stoi(date1.substr(6)); 
	int y2 = stoi(date2.substr(0,4)); 
	int m2 = stoi(date2.substr(4,2)); 
	int d2 = stoi(date2.substr(6)); 
	int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int count = 1;
	int flag = 1;
	if(y1==y2) 
		flag = 0;
	for(int y=y1 ; y<=y2 ; y++){
		if((y%4==0&&y%100!=0)||(y%400==0))
			a[2]+=1;
		if(y==y2&&flag==1){//在最后一年且并非同一年 
			for(int m=1 ; m<=m2 ; m++){
				if(m==m2)//最后一个月 
					count+=d2;
				else
					count+=a[m];
			}
		}
		else if(y!=y2&&y!=y1&&flag==1){//在中间年份且并非同一年 
			if(a[2]==28)
				count+=365;
			else
				count+=366;
		}
		else if(y==y1&&flag==1){//在第一年且并非同一年 
			count=count+(a[m1]-d1+1);
			for(int m=m1+1 ; m<=12 ; m++) 
				count+=a[m];
		}
		else if(flag==0){//在同一年 
			if(m1==m2)//如果是同一个月
				count=count+(d2-d1);
			else{
				count=count+(a[m1]-d1+1);
				for(int m=m1+1 ; m<m2 ; m++) 
					count+=a[m];
				count+=d2;
			}
		}
	}
	cout<<count;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值