兩種日曆計算對應的日期的星期幾?
剛開始理解錯題意了,不是說以2023年9.2與1752.9.14作為分界線,計算天數時,查詢日期在分界線前的天數計算用舊曆閏年規則計算;查詢日期在後面的、日期就分成兩半,界線前的按舊曆、界線後的按新曆閏年規則計算,不是這樣的。如果這樣那麼新曆的延後幾天用來彌補之前的誤差就沒有了意義,而是說:
查詢日期在1752.9.2之前的,計算天數用舊曆的計算閏年的規則;查詢日期在1752.9.14之後的,計算天數直接全用新曆的計算閏年的規則,這樣題目中說的彌補誤差才是有意義的。也就是說,本質上,問題是兩種日曆計算對應的日期的星期幾。
有很多坑。上面的題意算乙個。
其次,檢查無效日期,分兩類,一類是錯誤的即比如1月「89日」2023年的這種,而對應不同月份,比如1月和2月,上限分別是31天和30天,而對於是否閏年的2月,也同樣有不一樣的上限;其次,另一類是對應題意的無效日期,即1752.9.3~1752.9.13是不存在的,是新曆和舊曆都不存在的,舊曆按照sample output,是從最初(公元1年)到1752.9.2,而新曆是從1752.9.14到現在或者未來。
而計算星期幾,網上有這樣的計算公式。這裡沒有用公式,是用的從公元1年1月1日(包括這一天)到所查日期(包括所查日期)一共多少天,week[day%7]就是週幾,而week陣列是從0開始的,week[0]對應週日,week[1]對應周一......week[6]對應週六。但要注意,這樣的計算方式是用新歷來算(因為舊曆有誤差),這樣算出的對於1752.9.2之前的數算出的週幾再和sample output給出的對應日期的週幾相比較(題目中可用的是,2 11 1732、9 2 1752),從而得出新曆和舊曆轉換的規律,old_week=(new_week+5)%7。
因為細節比較多,所以**個部分實現的順序也要注意,不然因為之前各個變數有初始化的原因,可能計算出錯誤的結果。
1 凡是與日期轉換有關,應學習關於閏年的處理方式,單獨乙個函式判斷閏年( int run_year() )&&二維陣列來儲存有關閏年的天數選擇:
int year_day[2]=;
int month_day[2][13]=;
2
計算天數:是從公元1年1月1日到查詢日期(包括在內)有多少天,day%7即週幾,而week陣列是從0到6分別對應周天、周一......週六,當然對應其他的日期開始也可以只要知道開始日期對應的週幾,此方法僅對於新曆有效(閏年計算規則:被4整除但不被100整除的,以及被400整除的)。
#include #include #include #include using namespace std;
int year_day[2]=;
int month_day[2][13]=;
char month_name[20]=;
char week_name[20]=;
int sum,year,month,day,week;
int old;
int run_year(int temp)
else
}int judge()
if(judge()==0)
for(int i=1;i
csp試題2 日期計算
問題描述 給定乙個年份y和乙個整數d,問這一年的第d天是幾月幾日?注意閏年的2月有29天。滿足下面條件之一的是閏年 1 年份是4的整數倍,而且不是100的整數倍 2 年份是400的整數倍。輸入格式 輸入的第一行包含乙個整數y,表示年份,年份在1900到2015之間 包含1900和2015 輸入的第二...
201509 2 日期計算
試題編號 201509 2 試題名稱 日期計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定乙個年份y和乙個整數d,問這一年的第d天是幾月幾日?注意閏年的2月有29天。滿足下面條件之一的是閏年 1 年份是4的整數倍,而且不是100的整數倍 2 年份是400的整數倍。輸入格...
201509 2 日期計算
問題描述 試題編號 201509 2 試題名稱 日期計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 給定乙個年份y和乙個整數d,問這一年的第d天是幾月幾日?注意閏年的2月有29天。滿足下面條件之一的是閏年 1 年份是4的整數倍,而且不是100的整數倍 2 年份是400的整數...