題目要求如下:
-----------------------------------------------------------------------------------------------------------------------------------------------
代碼如下:
/*
* Copyright (c) 2013, 煙臺大學計算機學院
* All rights reserved.
* 作 者: 沈遠宏
* 完成日期:2014 年06月11日
* 版 本 號:v1.0
* 問題描述:Description
對於按照"yyyymmddhhmmss"格式給定的時間,計算兩個時間的差值。其中yyyy 表示年(0000~3000),mm表示月(00~12),dd表示日(00~31),hh表示時(00~23),mm表示分(00~59),ss表示秒(00~59)。已給定類部分代碼,不可刪除和修改已有代碼,只可以擴充。
Input
第一行整數n(n<=100),表示需要計算的時間差值數目。以後n行,每行兩個用空格隔開的按照"yyyymmddhhmmss"格式的數字串。
Output
每組時間差值輸出單獨一行。用空格分隔的兩個數,表示兩個時間相差的天數和秒數。
*/
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
class DateTime
{
public:
int year;
int month;
int day;
int hour;
int minute;
int seconds;
public:
void set(char*);
int char2int(char c);
void TimeDiff(DateTime &t1,DateTime &t2,int &days,int &seconds);
//對t1 ,t2 表示的兩個時間計算時間差值,將相差的天數保存在days中,將相差的秒數保存在seconds中
int count_d();
int count_s();
};
void DateTime::set(char* s)
{
year=char2int(s[0])*1000+char2int(s[1])*100+char2int(s[2])*10+char2int(s[3]);
month=char2int(s[4])*10+char2int(s[5]);
day=char2int(s[6])*10+char2int(s[7]);
hour=char2int(s[8])*10+char2int(s[9]);
minute=char2int(s[10])*10+char2int(s[11]);
seconds=char2int(s[12])*10+char2int(s[13]);
}
int DateTime::char2int(char c)
{
int res=0;
switch(c)
{
case '0':
res=0;
break;
case '1':
res=1;
break;
case '2':
res=2;
break;
case '3':
res=3;
break;
case '4':
res=4;
break;
case '5':
res=5;
break;
case '6':
res=6;
break;
case '7':
res=7;
break;
case '8':
res=8;
break;
case '9':
res=9;
break;
default:
res=0;
}
return res;
}
void DateTime::TimeDiff(DateTime &t1,DateTime &t2,int &days,int &seconds)
{
if(t1.year>t2.year)
{
for(int i=t2.year; i<(t1.year-t2.year); ++i)
{
if((i%4==0&&i%100!=0)||i%400==0)
{
days+=366;
}
else
{
days+=365;
}
}
days=days-t1.count_d()+t2.count_d();
}
else if(t1.year<t2.year)
{
for(int i=t1.year; i<(t2.year-t1.year); ++i)
{
if((i%4==0&&i%100!=0)||i%400==0)
{
days+=366;
}
else
{
days+=365;
}
}
days=days-t2.count_d()+t1.count_d();
}
else
{
if(t2.count_d()>t1.count_d())
{
days=t2.count_d()-t1.count_d();
}
else if(t2.count_d()<t1.count_d())
{
days=t1.count_d()-t2.count_d();
}
else days=0;
}
cout<<days<<" ";
if(t1.hour>t2.hour)
{
seconds=t1.count_s()-t2.count_s();
}
else if(t1.hour<t2.hour)
{
seconds=t2.count_s()-t1.count_s();
}
else
{
if(t1.minute>t2.minute)
{
seconds=t1.count_s()-t2.count_s();
}
else if(t1.minute<t2.minute)
{
seconds=t2.count_s()-t1.count_s();
}
else
{
if(t1.seconds>t2.seconds)
{
seconds=t1.seconds-t2.seconds;
}
else if(t1.seconds<t2.seconds)
{
seconds=t2.seconds-t1.seconds;
}
else
{
seconds=0;
}
}
}
cout<<seconds<<endl;
}
int DateTime::count_d()
{
int d;
switch(month)
{
case 1:
d=day;
break;
case 2:
d=day+31;
break;
case 3:
d=day+31+28;
break;
case 4:
d=day+31+28+31;
break;
case 5:
d=day+31+28+31+30;
break;
case 6:
d=day+31+28+31+30+31;
break;
case 7:
d=day+31+28+31+30+31+30;
break;
case 8:
d=day+31+28+31+30+31+30+31;
break;
case 9:
d=day+31+28+31+30+31+30+31+31;
break;
case 10:
d=day+31+28+31+30+31+30+31+31+30;
break;
case 11:
d=day+31+28+31+30+31+30+31+31+30+31;
break;
case 12:
d=day+31+28+31+30+31+30+31+31+30+31+30;
break;
}
if((year%4==0&&year%100!=0)||year%400==0)//閏年366
{
d++;
}
return d;
}
int DateTime::count_s()
{
return 3600*hour+60*minute+seconds;
}
int main()
{
int n,days=0,seconds=0;
DateTime d1,d2;
char s1[14],s2[14];
freopen("E.txt","r",stdin);
cin>>n;
for(int i=0; i<n; ++i)
{
for(int j=0; j<14; ++j)
{
cin>>s1[j];
}
for(int j=0; j<14; ++j)
{
cin>>s2[j];
}
d1.set(s1);
d2.set(s2);
d1.TimeDiff(d1,d2,days,seconds);
}
return 0;
}
運行結果:
OJ要求結果輸出例樣: