NJUPT ACM 合法日期

2021-06-27 00:55:24 字數 3097 閱讀 6934

合法日期問題

一、   課題概述

知道日期的來歷嗎。我們通常以公元紀年,如公元2023年。

這種國際通行的紀年體系以傳說中耶穌**的生年為公曆元年(相當於中國西漢平帝元年)。一年包括12個月,每個月的天數不全相同。

星期的起源應該是連繫著月亮的週期,因為七天大約是月亮一周的四份之一。

sunday、monday、tuesday、wednesday、thursday、friday、saturday依次表示星期日、星期

一、星期

二、星期

三、星期

四、星期

五、星期六。

給定乙個日期,判斷是否合法。。

輸入

對於每個測試用例:

輸出yes或no,判斷y、m、d、w是否構成乙個合法的日期。

二、   設計與實現

此題目對日期的合理性和所讀入的星期進行判斷,並進行相應的輸出。

對日期規則設定利用if語句將所有不合法的範圍列出並返回false。

計算星期幾則利用基姆拉爾森計算公式w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7

公式中d表示日期中的日數,m表示月份數,y表示年數。得到的值加1則是對應的星期。注意:在公式中有個與其他公式不同的地方:把一月和二月看成是上一年的十三月和十四月例:如果是2014-1-1則換算成:2013-13-1來代入公式計算,得w=2,w++,則對應週三。

定義bool back函式返回日期是否合法,若合法返回true,否則返回false。

main函式得到返回值並進行相應的輸出。

c++**耗時約200ms,但是c語言寫的**耗時約15ms,於是**都附上

以下分別為用c++和c語言實現具體**:

c++:

#include

using

namespace std;

#include

bool back(int

y,int

m,int

d,char

week)//boolback

函式判斷是否滿足合法日期條件

else

if (m == 1 &&d> 31) return

false;

if (m == 1 ||m == 2)//

判斷星期用基姆拉爾森計算公式w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7,得到的值加一則是對應的星期

switch (((d + 2 *m + 3 * (m + 1) / 5 +y + y / 4 - y / 100 + y / 400) % 7) + 1)

return

true;

}int main()

return 0;

c:#include

#include

bool back(int

y, int

m, int

d, char

w)  //

判斷是否合法函式

else

if (m == 1 &&d> 31) return

false;

if (m == 1 ||m == 2)

switch ((d + 2 *m + 3 * (m + 1) / 5 +y + y / 4 - y / 100 + y / 400) % 7 + 1)  //

基姆拉爾森計算公式w+1

return

true;

}int main()

return 0;

三、  測試資料和結果分析

輸入5//測試次數

2009 5 29 monday//年月日星期

2009 5 30 saturday

2007 2 29 sunday

2014 11 14 tuesday

2014 11 16 sunday

輸出no

yesno

noyes

四、總結

1.這個acm題目倒也不是很難,雖然runtime error at test 1(access_violation)

但是經過除錯發現是判斷語句格式的問題,雖然第一天便在 virtual studio 完美執行,但是是acm系統給出的測試中報錯wrong answer at test 1,便覺得奇怪,修改了演算法,還是不行,於是確定是系統輸入輸出先後問題。

我拿到題目時候,看到的是先輸入測試次數n 然後輸入n組資料,然後電腦程式處理,最後一起集中輸出。這種程式要求的實現我用的是定義乙個動態陣列int *temp = new int[n];將每次迴圈返回的引數放到乙個陣列裡面,最後遍歷陣列,進行相應的輸出。

但是這個題目真正要求的是進行分散處理,也就是說,輸入一組資料,進行處理輸出。這樣比較簡單,不存在儲存的問題。但是題目要求寫的不太清楚,是我反覆檢查了自己的**,新增了bool back函式,而不是如**下面所示有太多的輸出累贅語句,至少修改之後看上去比較簡潔,也容易理解。

2. 利用呼叫函式的到函式值並進行相應的操作。我習慣於用c++進行碼**,但是c++編譯在某處出現問題,於是我試著用c語言寫了乙個,試著提交通過了,於是我就跟蹤c++些的**,除錯了好多次,最後發現問題出在case語句以及virtual studio和g++編譯差異引起的

3.雖然正確答案沒能用到其中處理其中輸出方法,但是我了解了c++和c動態陣列的申請與釋放,c++用new申請,delect來釋放

//c++中用指標p指向new動態分配的長度為len*sizeof(int)的記憶體空間

// int  *p=new   int[len];

// delete   p;

而c語言用記憶體空間函式malloc和calloc申請,free(void*ptr)進行釋放,而且函式呼叫分別必須包含標頭檔案malloc.h和calloc。

4.此程式運用了大量的if和if else語句用來判斷每個細節的合法性。通過這道題我更深入掌握到了if 語句和break語句,以及strcmp(s1,s2)字串比較函式和相關函式,及c++ 和c字串的區別和聯絡。

python合法日期 python日期處理

3.日期比較操作 在datetime模組中有timedelta類,用於表示乙個時間間隔。import datetime datetime.timedelta days 0,seconds 0,microseconds 0,milliseconds 0,minutes 0,hours 0,weeks ...

Java判斷日期是否合法

記錄一下專案中遇到的乙個bug,當時原有工具類中的 如下 public static boolean isdate string str catch exception e return result 當輸入字串為2018 02 31時返回true,日期預設轉換為了2018 03 03,未對時間格式...

python之判斷合法日期

年月日分別為自定義函式的引數,判斷某乙個日期是否為合法的日期 如 2020年12月33日不是合法的日期 2021年2月29日是不合法的日期 看 方法一 def fn3 year,month,day if month 12 or month 0 return s年 s月 s日不是合法日期 year,m...