1. 程式人生 > >HDU 6112 今夕何夕 數論

HDU 6112 今夕何夕 數論

spa http include can 日期 oid amp space 接下來

今夕何夕

Description

今天是2017年8月6日,農歷閏六月十五。
小度獨自憑欄,望著一輪圓月,發出了“今夕何夕,見此良人”的寂寞感慨。
為了排遣郁結,它決定思考一個數學問題:接下來最近的哪一年裏的同一個日子,和今天的星期數一樣?比如今天是8月6日,星期日。下一個也是星期日的8月6日發生在2023年。
小貼士:在公歷中,能被4整除但不能被100整除,或能被400整除的年份即為閏年。

Input

第一行為T,表示輸入數據組數。
每組數據包含一個日期,格式為YYYY-MM-DD。
1 ≤ T ≤ 10000
YYYY ≥ 2017
日期一定是個合法的日期

Output

對每組數據輸出答案年份,題目保證答案不會超過四位數。

Sample Input

3
2017-08-06
2017-08-07
2018-01-01

Sample Output

2023
2023
2024


題意

給定一個合法日期如X年m月d日,詢問這之後的哪一年m月d日和X年m月d日的星期幾相同。

題解

基姆拉爾森計算公式:

W = (D + 2 * M + 3 * (M + 1) \ 5 + Y + Y \ 4 - Y \ 100 + Y \ 400) Mod 7

【預處理:當年的1月、2月轉換至去年的13月、14月】

註意在計算2月29的時候先判斷是否存在(跪在這裏WA了3發)

代碼

 1 //HDU-6112 copyright:scidylanpno
2 #include<bits/stdc++.h> 3 using namespace std; 4 5 int GetDay(int y,int m,int d){ 6 7 if(m==1||m==2) y-=1,m+=12; 8 int ans= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7; 9 return ans; 10 } 11 12 void Run() 13 { 14 char str[20]; 15 int y=0,m=0,d=0; 16 scanf("%s",str); 17 for
(int i=0;i<4;i++) 18 { 19 y*=10; 20 y+=(str[i]-0); 21 } 22 for(int i=5;i<=6;i++) 23 { 24 m*=10; 25 m+=(str[i]-0); 26 } 27 for(int i=8;i<=9;i++) 28 { 29 d*=10; 30 d+=(str[i]-0); 31 } 32 int W=GetDay(y,m,d); 33 if(m==2&&d==29) 34 for(int Y=y+4;;Y+=4) 35 { 36 if((Y%400==0||(Y%4==0&&Y%100!=0))&&W==GetDay(Y,m,d)) 37 { 38 39 printf("%d",Y); 40 return; 41 } 42 } 43 44 for(int Y=y+1;;Y++) 45 { 46 if(W==GetDay(Y,m,d)) 47 { 48 49 printf("%d",Y); 50 return; 51 } 52 } 53 } 54 55 int main() 56 { 57 int T; 58 scanf("%d",&T); 59 while(T--) 60 { 61 Run(); 62 //if(T) 63 printf("\n"); 64 } 65 return 0; 66 }

題解鏈接:http://www.cnblogs.com/scidylanpno/p/7354392.html

版權所有:scidylanpno

HDU 6112 今夕何夕 數論