Compile the world

【转自网络大神,由本人整理】

Description

试用 C++的类来表示日期,给定 2 个日期 yyyy.mm.dd 求两个日期间相差的天数。

Input

第 1 行为一个正整数T,表示测试数。

对于每个测试点,第 1 行与第 2 行分别有两个日期 yyyy.mm.dd。

Output

对于每个测试点,输出一行数字,表示相差的天数。

Sample Input

Copy sample input to clipboard

22000.02.282000.03.016297.01.212351.11.27

Sample Output

21440938

方法一:【来自@chenhq1991】

#include<iostream>#include<string>using namespace std;int DaysOfYear(int year){if((year % 4 == 0 && year % 100 != 0) ||(year % 400 == 0)){return 366;//闰年}else{return 365;}}int DaysOfMonth(int year,int month){switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 2:if((year % 4 == 0 && year % 100 != 0) ||(year % 400 == 0))return 29;elsereturn 28;case 4:case 6:case 9:case 11:return 30;default:return 0;}}class Date{public:Date(string date){year = month = day = 0;int firstDot = date.find('.',0);//找到年后的那个点int secondDot = date.find('.', firstDot + 1);//找到月后的那个点//处理dayint counter = 0;for(int i = date.length() – 1; i > secondDot; i–){char d = date[i];int temp = d – 48;for(int j = 0; j < counter; j++){temp = temp * 10;}day = day + temp;counter++;}counter = 0;//处理monthfor(int i = secondDot – 1; i > firstDot; i–){char m = date[i];int temp = m – 48;for(int j = 0; j < counter; j++){temp = temp * 10;}month = month + temp;counter++;}counter = 0;//处理yearfor(int i = firstDot – 1; i >= 0; i–){char y = date[i];int temp = y – 48;for(int j = 0; j < counter; j++){temp = temp * 10;}year = year + temp;counter++;}}int GetYear(){return year;}int GetMonth(){return month;}int GetDay(){return day;}//重载‘-’//要求left 的时间晚于 right的friend int operator – (Date left, Date right){int daysBeforeRight = 0;//先计算出右边的日期是一年中的哪一天for(int i = 1; i < right.GetMonth(); i++){daysBeforeRight = daysBeforeRight + DaysOfMonth(right.GetYear(), i);}daysBeforeRight = daysBeforeRight + right.GetDay();//如果是2000.1.1,daysBeforeRight 就是1int daysBeforeLeft = 0;//计算出左边的日期是一年中的哪一天for(int i = 1; i < left.GetMonth(); i++){daysBeforeLeft = daysBeforeLeft + DaysOfMonth(left.GetYear(), i);}daysBeforeLeft = daysBeforeLeft + left.GetDay();int interval = 0;//两个日期的间隔for(int i = right.GetYear(); i < left.GetYear(); i++){interval = interval + DaysOfYear(i);}//实际的间隔interval = interval – daysBeforeRight + daysBeforeLeft;return interval;}private:int year;int month;int day;};int main(){int caseNum;cin >> caseNum;while(caseNum–){string first, second;cin >> first >> second;Date one(first);Date two(second);//比较两个时间的先后if(first.length() > second.length())//长度长的时间较晚{int interval = one – two;cout << interval << endl;}else{if(first.length() < second.length()){int interval = two – one;cout << interval << endl;}else//长度相等{if(first > second)//字符串比较大小,大的时间较晚{int interval = one – two;cout << interval << endl;}else{int interval = two – one;cout << interval << endl;}}}}return 0;}方法二:【来自@绿夜】

#include<iostream>#include<string>using namespace std;int DaysOfYear(int year){if((year % 4 == 0 && year % 100 != 0) ||(year % 400 == 0)){return 366;//闰年}else{return 365;}}int DaysOfMonth(int year,int month){switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 2:if((year % 4 == 0 && year % 100 != 0) ||(year % 400 == 0))return 29;elsereturn 28;case 4:case 6:case 9:case 11:return 30;default:return 0;}}class Date{public:Date(string date){year = month = day = 0;int firstDot = date.find('.',0);//找到年后的那个点int secondDot = date.find('.', firstDot + 1);//找到月后的那个点//处理dayint counter = 0;for(int i = date.length() – 1; i > secondDot; i–){char d = date[i];int temp = d – 48;for(int j = 0; j < counter; j++){temp = temp * 10;}day = day + temp;counter++;}counter = 0;//处理monthfor(int i = secondDot – 1; i > firstDot; i–){char m = date[i];int temp = m – 48;for(int j = 0; j < counter; j++){temp = temp * 10;}month = month + temp;counter++;}counter = 0;//处理yearfor(int i = firstDot – 1; i >= 0; i–){char y = date[i];int temp = y – 48;for(int j = 0; j < counter; j++){temp = temp * 10;}year = year + temp;counter++;}}int GetYear(){return year;}int GetMonth(){return month;}int GetDay(){return day;}//重载‘-’//要求left 的时间晚于 right的friend int operator – (Date left, Date right){int daysBeforeRight = 0;//先计算出右边的日期是一年中的哪一天for(int i = 1; i < right.GetMonth(); i++){daysBeforeRight = daysBeforeRight + DaysOfMonth(right.GetYear(), i);}daysBeforeRight = daysBeforeRight + right.GetDay();//如果是2000.1.1,,daysBeforeRight 就是1int daysBeforeLeft = 0;//计算出左边的日期是一年中的哪一天for(int i = 1; i < left.GetMonth(); i++){daysBeforeLeft = daysBeforeLeft + DaysOfMonth(left.GetYear(), i);}daysBeforeLeft = daysBeforeLeft + left.GetDay();int interval = 0;//两个日期的间隔for(int i = right.GetYear(); i < left.GetYear(); i++){interval = interval + DaysOfYear(i);}//实际的间隔interval = interval – daysBeforeRight + daysBeforeLeft;return interval;}private:int year;int month;int day;};int main(){int caseNum;cin >> caseNum;while(caseNum–){string first, second;cin >> first >> second;Date one(first);Date two(second);//比较两个时间的先后if(first.length() > second.length())//长度长的时间较晚{int interval = one – two;cout << interval << endl;}else{if(first.length() < second.length()){int interval = two – one;cout << interval << endl;}else//长度相等{if(first > second)//字符串比较大小,大的时间较晚{int interval = one – two;cout << interval << endl;}else{int interval = two – one;cout << interval << endl;}}}}return 0;}自己的,基本按照大神的思路

数最亮的星。如果有可能,我带你去远行。

Compile the world

相关文章:

你感兴趣的文章:

标签云: