UVA602 日期計算 2 模擬 細節

2021-07-24 10:04:59 字數 1531 閱讀 8582

兩種日曆計算對應的日期的星期幾?

剛開始理解錯題意了,不是說以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的整數...