1145:金曜日は13日(C版)

12766 ワード

テーマの説明は13日でまた金曜日です.13日は金曜日で他の日より少ないですか?この質問に答えるために、毎月の13日が月曜日から日曜日に落ちる回数を計算するプログラムを書きます.N年の周期を与え、1900年1月1日から1900+N-1年12月31日のうち13日が月曜日から日曜日に落ちる回数を計算することを要求し、Nは正の整数で400以下である.ここにはいくつか知っておくべきことがあります.1、1900年1月1日は月曜日です.2、4、6、11と9月は30日ある.他の月は2月を除いて31日あります.閏年2月は29日、平年2月は28日である.3、年が4で割り切れるのは閏年(1992=4*498だから1992年は閏年だが、1990年は閏年ではない).4、以上のルールは世紀年には向いていない.400で割り切れる世紀年は閏年、そうでなければ平年です.したがって、170018001900年と2100年は平年であり、2000年は閏年である.既成の関数を呼び出さないでください.予めデータを計算しないでください.正の整数nを入力してください.
1行に7つの整数を出力し、13日が土曜日、日曜日、月曜日...金曜日の回数を表す.
サンプル入力20サンプル出力36 33 34 33 35 34ヒントソース
分析:まず、この問題の難易度はどのように毎月の13日の対応する曜日を求めて、あるいは1種の構想を変えて、今日はX日の月曜日で、それでは1ヶ月後のX日は何曜日ですか?特にXを気にしないで、ただ1種の法則を探すだけでいいです;
コード:
#include 
#include 
int main(){
    int PN[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int RN[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int SHISANHAO[n*12];// n  12 13 ;
        int Mondy[7]={0,0,0,0,0,0,0};
        int T=0;//T      13 
        SHISANHAO[T]=6;//   13     ;
        for(int i=1900;i<=1900+n-1;i++)
        {
            if(i%4==0&&i%100!=0||i%400==0)
            {
                for(int j=0;j<12;j++)
                {   T++;
                    SHISANHAO[T]=(SHISANHAO[T-1]+RN[j])%7;
                    //   13             13               7   ;
                    //     , 7        0  ;
                }
            }
            else
            {
                for(int j=0;j<12;j++)
                {   T++;
                    SHISANHAO[T]=(SHISANHAO[T-1]+PN[j])%7;//  

                }
            }
        }
        for(int i=0;i<T;i++)
        {
            Mondy[SHISANHAO[i]]++;//  13        
        }
        printf("%d ",Mondy[6]);//      
        for(int i=0;i<5;i++)
        {
            printf("%d ",Mondy[i]);//              ;
        }
         printf("%d
"
,Mondy[5]);// , 。 } }

2020年2月10日初書き