合法日期問題
一、 課題概述
知道日期的來歷嗎。我們通常以公元紀年,如公元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...