计算两个日期之间的天数的思路:
首先,判断输入的年份是不是闰年。年份是否相同?月份是否相同?日是否相同?
日月年有三种可能的情况:
- 同年同月。日数相减就出来了。
- 同年不同月。计算日期小的月份到年初的天数,计算日期大的月份到年初的天数。再把两个日期向减
- 不同年。先计算中间相隔几年,计算较小的日期到年底有多少天,再计算较大的日期距年初有多少天,将三个数向加。
代码如下:
1 #include<iostream> 2 #include<CString> 3 #include<cmath> 4 using namespace std; 5 6 bool isleapyear(int year) //判断是否是闰年 7 { 8 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 9 return 1; 10 else 11 return 0; 12 } 13 14 int Days(int y, int m, int d) //计算y年m月d日到y年1月1日的天数 15 { 16 int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 17 int i; 18 int sum = 0; /* 计算天数 */ 19 if (isleapyear(y)) /* 如果为闰年,2月有 29 天 */ 20 days[2] = 29; 21 for (i = 0; i<m; i++) 22 sum = sum + days[i]; 23 sum = sum + d - 1; 24 return sum; 25 } 26 27 int Days(int y1, int m1, int d1, int y2, int m2, int d2) //计算年月日都不相同的两个日期之间的天数 28 { 29 int t1; 30 int t2; 31 int year = y2-y1; 32 int sum=0; //相差的天数 33 if (year == 1) //如果两个日期的年份相差为1 34 { 35 t1 = Days(y1, 12, 31) - Days(y1, m1, d1); //较小的日期计算y1年m1月d1日到年底的天数 36 t2 = Days(y2, m2, d2); //较大的日期计算y2年m2月d2日到年初的天数 37 sum = t1 + t2 + year; 38 } 39 else{ 40 for (int i = y1+1; i < y2; i++) 41 { 42 if (isleapyear(i)) 43 { 44 sum += 366; 45 } 46 else 47 sum += 365; 48 } 49 t1 = Days(y1, 12, 31) - Days(y1, m1, d1); 50 t2 = Days(y2, m2, d2); 51 sum = sum + t1 + t2 + 1; 52 53 } 54 return sum; 55 } 56 57 int main(){ 58 int year1; //较小的年份 59 int year2; 60 int month1; //较小的月份 61 int month2; 62 int day1; 63 int day2; 64 int day=0; 65 cin >> year1 >> month1 >> day1; 66 cin >> year2 >> month2 >> day2; 67 68 if (year1 > year2 || (year1 == year2) && (month1 > month2) || ((year1 == year2) && (month1 == month2)) && (day1 > day2) ) 69 { 70 cout << "输入错误" << endl; 71 } 72 else{ 73 74 if (year1 == year2&&month1 == month2) // 1.如果年和月相同,直接计算天数的差 75 { 76 day = abs(day2 - day1); 77 cout << day << endl; 78 } 79 else if (year1 == year2 && month1 != month2) // 2.如果年份相同而月份不同,则计算较小的日期到较大的日期的天数 80 { 81 day = abs(Days(year1, month1, year1) - Days(year2, month2, day2)); 82 cout << day << endl; 83 } 84 else 85 { 86 day = Days(year1, month1, day1, year2, month2, day2); 87 cout << day << endl; 88 } 89 } 90 return 0; 91 }
对于部分代码的理解:
int Days(int y, int m, int d) //计算y年m月d日到y年1月1日的天数 { int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int i; int sum = 0; /* 计算天数 */ if (isleapyear(y)) /* 如果为闰年,2月有 29 天 */ days[2] = 29; for (i = 0; i<m; i++) sum = sum + days[i]; sum = sum + d - 1; return sum; }
这段代码的理解可以用下图表示:
我们需要求的日期为两个红箭头之间的绿色部分。
1 for (int i = y1+1; i < y2; i++) 2 { 3 if (isleapyear(i)) 4 { 5 sum += 366; 6 } 7 else 8 sum += 365; 9 } 10 t1 = Days(y1, 12, 31) - Days(y1, m1, d1); 11 t2 = Days(y2, m2, d2); 12 sum = sum + t1 + t2 + 1;
这段代码的理解可以用下图表示:
2015年跟2011年相差的其实只有三年,刚开始写的时候年数直接写的是2015减2011,导致多算了一年。
时间: 2024-10-01 04:49:59