문제 P5407 [[THUPC2019] 역사 여정에 솔루션

테이블에 충돌하지 마십시오, 새로운 솔루션의 법칙을 계속 : 젤러의 적합성을

모든 알려진대로 일 Zeller 요일을 (윤년의 특별한 경우를 포함)의 몇 가지 강력한 공식을 해결하기위한 공식은

화학식 설명 :

주 = Y + [Y / 4 + [C / 4 -2C + [13 * (m + 1) / 5] + -1- 일

주 : 주, 주 7 얻기 모듈 : 0 등 일요일, 월요일, 1, 2 화요일;

C (영어 단어 세기 세기의 약어) : 년간 100 %는 미래 16C에만 적용

년 : 년 100 % 세 (마지막 두 자리 숫자)

예를 들어, 2,019 C가 20이고, Y는 19

달 : 달 (보다 크거나 년 2 월 13 일 젤러의 공식, 1 년, 연간으로 볼 수 있다는 3, 14 이하, 동일 개월, 14 개월 등의 모양 년 1 월 1 일, 2003과 같은, 계산 (13) 5 월 1 일 2002 계산)

일 : 일 [] 라운딩 나타내고, 즉, 긴 정수부.

2049년 10월 1일 해결하는 요일입니다, 예를 들어 봐 :

주 = Y + [Y / 4 + [C / 4 + -2C [13 (개월 + 1) / 5] + -1- 일

주 = 49 + [4분의 49] + [4분의 20] -2- 20 + [13 × (10 + 1) / 5] + (1-1) ×

주 = 49 + [12.25] + 5-40 + [28.6]

주 = 49 + 12 + 5-40 + (28)

주 = 54 % 7 I (5)

그것은 금요일입니다

코드 :

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;

int year,month,sunday;

int main(){
    //freopen("mother.txt","r",stdin);
    scanf("%d",&year);
    int c=year/100;
    int y=year%100;
    month=5;//直接把月份锁定在5月
    rep(day,1,31){//枚举5月的所有日期(5月大,31天)
        int week=(c/4)-2*c+(y+y/4)+(13*(month+1))/5+day-1;//蔡勒公式
        while(week<0)week+=7;//避免week为负
        week%=7;
        if(week==0)sunday++;//week==0即星期天,week不是==7,因为7%7==0
        if(sunday==2){//5月的第二个星期天,已找到
            printf("%d",day);
            break;
        }
    }
    return 0;
}

추천

출처www.cnblogs.com/sjsjsj-minus-Si/p/11634787.html