• 题解 P5407 【[THUPC2019]历史行程】


    不用打表,不用找规律的新新解法:蔡勒公式

    as is known to all,蔡勒公式是一个用于求解任意日期是星期几的强大公式(包括闰年的特殊情况)

    公式介绍:

    week=y+[y/4]+[c/4]-2c+[13*(m+1)/5]+day-1

    week:星期,week对7取模得:0-星期日,1-星期一,2-星期二,etc;

    c(世纪的英文单词century的缩写):year%100仅适用于16c以后

    year:year%100年(后两位数)

    如,2019的c为20,y为19

    month:月(month大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)

    day:日 [ ]代表取整,即只要整数部分。

    看个例子,求解2049年10月1日是星期几:

    week=y+[y/4]+[c/4]-2c+[13(month+1)/5]+day-1

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

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

    week=49+12+5-40+28

    week=54%7余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;
    }
    
  • 相关阅读:
    二维码生成器
    uniapp 上下左右手势滑动时的事件
    uniapp 类似钉钉的消息时间段显示
    css 币种与价格的底部对齐
    css 设置父元素透明度不影响子元素透明度
    js match方法截取某个字符串前面的内容
    下载电脑系统,服务等...
    uniapp 实现点击、滑动切换tab导航内容
    vue 实现分类渲染数据
    jquery 实现在事件完成后才能再次点击执行
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634787.html
Copyright © 2020-2023  润新知