1. 程式人生 > 實用技巧 >十三號星期五

十三號星期五

十三號星期五真的很不常見嗎?

每個月的十三號是星期五的頻率是否比一週中的其他幾天低?

請編寫一個程式,計算NN年內每個月的1313號是星期日,星期一,星期二,星期三,星期四,星期五和星期六的頻率。

測試的時間段將會開始於19001900年11月11日,結束於1900+N11900+N−1年1212月3131日。

一些有助於你解題的額外資訊:

  1. 19001900年11月11日是星期一。
  2. 在一年中,44月、66月、99月、1111月每個月3030天,22月平年2828天,閏年2929天,其他月份每個月31天。
  3. 公曆年份是44的倍數且不是100100的倍數的年份為閏年,例如19921992年是閏年,19901990年不是閏年。
  4. 公曆年份是整百數並且是
    400400的倍數的也是閏年,例如1700年,1800年,1900年,2100年不是閏年,2000年是閏年。

輸入格式

共一行,包含一個整數NN。

輸出格式

共一行,包含七個整數,整數之間用一個空格隔開,依次表示星期六,星期日,星期一,星期二,星期三,星期四,星期五在十三號出現的次數。

資料範圍

1N4001≤N≤400

輸入樣例:

20

輸出樣例:

36 33 34 33 35 35 34


本題不難,只是有點點繞,邏輯關係理清之後暴力就可以了
月份的天數在迴圈中用一個常量單獨處理,也可以放在數組裡處理。需要注意的是如果放在數組裡面處理,需要建立閏年和非閏年兩個不同的陣列。
程式碼及註釋如下:
 1 #include<iostream>
 2
#include<algorithm> 3 using namespace std; 4 int a[7]={0}; //答案記錄在一個數組中 5 6 int b[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //表示閏年各個月份的天數 7 int c[12]={31,28,31,30,31,30,31,31,30,31,30,31};//普通年份各個月份的天數 8 9 inline int isprime(int year){ //判斷是否是閏年 10 if(year%4==0&&year%100!=0) return 1;
11 else if(year%400==0) return 1; 12 return 0; 13 } 14 15 int n; 16 17 int main() 18 { 19 ios::sync_with_stdio(false); 20 cin>>n; 21 int year = 1900+n-1; 22 int res=-1; //因為儲存答案是從下標0開始,所以res從-1開始,每次進入迴圈對其進行 +1 23 24 for(int y = 1900;y<=year;++y){ 25 if(isprime(y)){ //如果是閏年 26 for(int i = 0;i<12;++i){ 27 for(int j = 1;j<=b[i];++j){ 28 res = (res+1)%7; //res+1 == 星期幾 這樣寫的目的是為了在計算答案和儲存答案的時候不出差錯,如果res==星期幾的話答案會截然不同 29 if(j==13){ 30 a[res]++; //13號的時候記錄下星期幾 31 32 } 33 } 34 } 35 } 36 37 else{ 38 for(int i = 0;i<12;++i){ 39 for(int j = 1;j<=c[i];++j){ 40 res = (res+1)%7; 41 if(j==13){ 42 a[res]++; 43 44 } 45 } 46 } 47 } 48 } 49 50 // printf("%d %d",a[5],a[6]); 51 // for(int i = 0;i<5;++i){ 52 // printf(" %d",a[i]); 53 // } 54 55 for(int i = 0;i<7;++i){ 56 printf("%d ",a[(i+5)%7]); 57 } 58 return 0; 59 }

如果對輸出格式沒有要求的話可以採用55-57行的方法,如果行末不能留有空格的話就使用我註釋掉的那段輸出程式碼!

感謝閱讀!!