蔡勒公式不对啊???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蔡勒公式不对啊???相关的知识,希望对你有一定的参考价值。

蔡勒(Zeller)公式:是一个计算星期的公式。
随便给一个日期,就能用这个公式推算出是星期几。蔡勒公式如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

公式中的符号含义如下:
w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
c:世纪(前两位数)
y:年(后两位数)
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
d:日
[ ]代表取整,即只要整数部分。

例如1990 1 13日是星期6,但用公式却是星期7

m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
1990 1 13 = 1989 13 13
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=89+[89/4]+[19/4]-2*19+[26(13+1)/10]+13-1
=89+[22.25]+[4.75]-38+[36.4]+12
=89+22+4-38+36+12
=125(125mod7=6)
1990 1 13 周六没错!
在计算机程序设计中通常都有MOD运算,它的含义是 取得两个整数相除后结果的余数。
例如:7 mod 3 = 1
因为7 除以 3 商2余1。余数1即执行MOD运算后的结果
可能是计算失误了吧

对蔡勒(Zeller)公式的改进

作者:冯思琮
W=[y/4]+r (y/7)-2r(c/4)+m’+d

公式中的符号含义如下,r ( )代表取余,即只要余数部分;m’是m的修正数,现给出1至12月的修正数1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在笔者给出的公式中,y为润年时1’=5;2’=1)。其他符号与蔡勒(Zeller)公式中的含义相同。

以2049年10月1日(100周年国庆)为例,分别用蔡勒(Zeller)公式和笔者给出的公式进行计算,过程如下:

蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

=49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1

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

=49+12+5-40+28

=54 (除以7余5)

笔者给出的公式: w=[y/4]+r (y/7)-2r(c/4)+m’+d

= [49/4]+r (49/7)-2r(20/4)+10’+1

=12+0-2×0+6+1

=19 (除以7余5)

即2049年10月1日(100周年国庆)是星期5。
方便很多吧

参考资料:http://www.21maths.com/public/mlsx/shsx/200407/829.html

参考技术A 蔡勒公式经过了100多年的检验,不会有错的:)

2017"百度之星"程序设计大赛 - 初赛(A)-1001.小C的倍数问题(HDU6108) 1005.今夕何夕-蔡勒公式 (HDU6112)

补完题?不存在的。

这么久了,还是一条咸鱼,看一堆乱七八糟的东西,写一堆没用的水题,一点进步都没有,还是那么菜,菜的掉渣。

这个百毒之星初赛A还会写两道最简单的水题,初赛B一点也不会,菜的难过。。。

最近看的dp和kmp,垂死挣扎,一点一点看吧。。。

cf打的还是那么弱,一点进步都没有。。。

好久没写博客了,最近写的都是水题,都没有写博客的必要,但是还是来水一水(;′д`)ゞ,要不就没有写博客的习惯了。

吐槽百毒之星,比赛的时候1005交上去,莫名其妙Output Limit Exceeded,然而晚上在杭电一点没改的又重新交了一次,过了?!过了,了。。。

写1001和1005的智障题解。。。

 

 

1001:小C的倍数问题

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 32768/32768 K (Java/Others)
 

Problem Description

根据小学数学的知识,我们知道一个正整数x是3的倍数的条件是x每一位加起来的和是3的倍数。反之,如果一个数每一位加起来是3的倍数,则这个数肯定是3的倍数。

现在给定进制P,求有多少个B满足P进制下,一个正整数是B的倍数的充分必要条件是每一位加起来的和是B的倍数。

Input

第一行一个正整数T表示数据组数(1<=T<=20)。

接下来T行,每行一个正整数P(2 < P < 1e9),表示一组询问。

Output

对于每组数据输出一行,每一行一个数表示答案。

Sample Input
1
10
Sample Output
3
 
题意一开始怎么都没看懂,不知道是我的脑回路和出题人不一样,还是因为我语文不好。。。还是大佬给我说的题意才理解的。
就是找1到p-1的因数的个数,比如10进制,就是0,1,2,3,4,5,6,7,8,9,哎呀,就是那个意思,想想就理解了。。。
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main(){
 5     ll t,n,sum;
 6     scanf("%lld",&t);
 7     while(t--){
 8         scanf("%lld",&n);
 9         sum=0;n--;
10         for(ll i=1;i<=(ll)sqrt(n);i++){
11             if(n%i==0&&n/i==i)sum++;
12             else if(n%i==0&&n/i!=i)sum+=2;
13         }
14         printf("%lld\n",sum);
15     }
16     return 0;
17 }

 

 

该写1005了。。。

1005:今夕何夕

Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)  
 

Problem 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

 

这个题意好理解,就是有一个坑,闰年有2月29日,要特判一下。用这个蔡勒公式,现学现用。。。

这个题反正写的很不开心,Output Limit Exceeded,(▼へ▼メ),一点不改的再交一遍就过了,可能这个测评机不喜欢我。。。

关于这个蔡勒公式,百度一下有,其他的,传送门:http://blog.csdn.net/areskris/article/details/8661983

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int gg(int y,int m,int d){                                //蔡勒公式,看传送门
 4     int iweek=0;
 5         int yy=0,c=0,mm=0,dd=0;
 6         if(m==1||m==2){
 7             c=(y-1)/100;
 8             yy=(y-1)%100;
 9             mm=m+12;
10             dd=d;
11         }
12         else{
13             c=y/100;
14             yy=y%100;
15             mm=m;
16             dd=d;
17         }
18         iweek=yy+yy/4+c/4-2*c+26*(mm+1)/10+dd-1;
19         iweek=iweek>=0?(iweek%7):(iweek%7+7);
20         if(iweek==0)iweek=7;
21         return iweek;
22 }
23 int main(){
24     int t,ans;
25     int y,m,d;
26     char k1,k2;
27     scanf("%d",&t);
28     while(t--){
29         scanf("%d%c%d%c%d",&y,&k1,&m,&k2,&d);
30         ans=gg(y,m,d);                                     //找出来是星期几。
31         if(m==2&&d==29){                                   //特判2月29,只找闰年的就可以。
32             for(int i=y+4;i<=9999;i+=4){                   //每4年加一次,题目说了答案不会超过4位数,所以9999。
33             if((i%4==0&&i%100!=0)||i%400==0){              //判断闰年。
34             if(gg(i,m,d)==ans){                            //判断一下就可以。
35                 printf("%d\n",i);
36                 break;                                     //因为题意是找最近的一年。
37             } 
38             }
39             }
40         }
41         else{
42         for(int i=y+1;i<=9999;i++){                       
43             if(gg(i,m,d)==ans){                            //没什么好解释的,大体同上。
44                 printf("%d\n",i);
45                 break;
46             }
47         }
48         }
49     }
50     return 0;
51 }

 

我对自己好失望,太菜了,看一个题不会,再看一个题还是不会,写a+b还没有成就感,写稍微难一点的题要改好久才改对。。。

(;′д`)ゞ

加油呗,垃圾。

 

 

 
    

 

 

 
 

 

以上是关于蔡勒公式不对啊???的主要内容,如果未能解决你的问题,请参考以下文章

蔡勒公式是啥?

蔡勒公式是?

谁知道怎么用C语言编写万年历啊

蔡勒公式——根据年月日计算星期几

蔡勒公式

蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数