標籤:

模擬——日期計算器(20180125)

模擬——日期計算器(20180125)

來自專欄 OJ刷題經驗匯總

模擬——日期計算器(20180125)

《演算法筆記》3.4

題目:

題目描述

有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天。

輸入

有多組數據,每組數據有兩行,分別表示兩個日期,形式為YYYYMMDD

輸出

每組數據輸出一行,即日期差值

樣例輸入

20130101

20130105

樣例輸出

5

分析

比較常規的模擬題,但是過程的實現比較繁瑣,很容易寫著寫著失去耐心。

1.如何從數中提取出年月日?

—利用取余還有除法運算,以及int類型除法截斷的特性。

2.如何算天數差?

分情況討論:

1.同年:思路1:利用循環,事先用數組存好每個月對應的天數,再來逐月相加

??? 思路2:算好每個日期對應的天數再相減

2.不同年:先算出不同年份之間的天數差,加上天數差後再加上前一年距離年終的天數和年末對應的天數(參考1中的思路2)

3.最後注意初始化變數應為1

4.判斷平閏年是老套路了

題解

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int yue1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};\月份數組
  4. const int yue2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};\月份數組
  5. int rizi(int y,int m,int d){
  6. int t=0;
  7. if((y%4==0&&y%100!=0)||(y%400==0))\判斷平閏年
  8. {
  9. for(int i=1;i<=m;i++)
  10. t+=yue2[i];
  11. t+=d;
  12. }
  13. else{
  14. for(int i=1;i<=m;i++)
  15. t+=yue1[i];
  16. t+=d;
  17. }
  18. return t;
  19. }
  20. int main(int argc, char** argv) {
  21. int a1,a2;
  22. while(scanf("%d %d",&a1,&a2)!=EOF){
  23. if(a1>a2) swap(a1,a2);
  24. int day=1;
  25. int y1=a1/10000,m1=(a1%10000)/100,d1=a1%100;\提取年月日
  26. int y2=a2/10000,m2=(a2%10000)/100,d2=a2%100;\提取年月日
  27. if(y1==y2){
  28. day+=rizi(y2,m2,d2)-rizi(y1,m1,d1);
  29. cout<<day<<endl;}
  30. else{
  31. for(int i=y1+1;i<y2;i++)\循環加年份,下一年開始到最後之前
  32. {
  33. if((i%4==0&&i%100!=0)||(i%400==0))
  34. day+=366;
  35. else
  36. day+=365;
  37. }
  38. if((y1%4==0&&y1%100!=0)||(y1%400==0)){
  39. day+=366-rizi(y1,m1,d1);
  40. day+=rizi(y2,m2,d2);
  41. }
  42. else{
  43. day+=365-rizi(y1,m1,d1);
  44. day+=rizi(y2,m2,d2);
  45. }
  46. cout<<day<<endl;
  47. }}
  48. return 0;
  49. }

另解(模擬數日子的思路)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int month [13][2]={
  4. {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
  5. {30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
  6. bool isLeap(int year){
  7. return (year%4==0&&year%100!=0)||(year%400==0);
  8. }
  9. int main(){
  10. int time1,y1,m1,d1;
  11. int time2,y2,m2,d2;
  12. while(scanf("%d %d",&time1,&time2)!=EOF){
  13. if(time1>time2) swap(time1,time2);
  14. y1=time1/10000,m1=time1%10000/100,d1=time1%100;
  15. y2=time2/10000,m2=time2%10000/100,d2=time2%100;
  16. int ans=1;
  17. while(y1<y2||m1<m2||d1<d2){
  18. d1++;
  19. if(d1==month[m1][isLeap(y1)]+1){
  20. m1++;
  21. d1=1;
  22. }
  23. if(m1==13){
  24. y1++;
  25. m1=1;
  26. }
  27. ans++;
  28. }
  29. cout<<ans<<endl;
  30. }
  31. return 0;
  32. }

總結:

月份計算應注意的問題

1.平年閏年,2月天數:

判斷語句: if((y%4==0&&y%100!=0)||(y%400==0))

2.大月小月——事先構造常量數組

(第一個題解在openjudge上只能得7分,不知道為什麼,求助)

相關題目

noi.openjudge.cn/ch0113


推薦閱讀:

計算機科學中的幾個常見概念
誰說知乎是逼乎?
CS224N Lecture2 筆記
《代碼之髓》讀後感

TAG:計算機科學 |