蔡勒公式
蔡勒(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:日
[ ]代表取整,即只要整数部分。
以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。
后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历或公历。
以下是代码实现:
#include
<
string
>
#include
<
iostream
>
using
namespace
std;
void
Zeller()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
string Weekday[7] =
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
"星期日","星期一","星期二",
"星期三","星期四","星期五",
"星期六"
};
int Month[12] =
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
31,28,31,30,31,30,31,31,20,31,30,31
};
int year, month, day,w,c,y,m,d ;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
do...{
cout << "请输入年份:" << endl;
cin >> year;
}
while(year > 10000 && year <= 1582);
if( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ) //判断闰年的情况
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Month[1] = 29;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
do...{
cout << "请输入月份:" << endl;
cin >> month;
}
while(month > 12 || month <= 0);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
do...{
cout << "请输入日期:" << endl;
cin >> day;
}
while(day > Month[month - 1] || day <= 0);
//使用蔡勒(Zeller)公式计算星期几,1582年后有效
if( month <= 2) //1,2 月看做上一年的 13,14 月
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
c = (year - 1) / 100;
y = (year - 1) % 100;
m = month + 12;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
c = year / 100;
y = year % 100;
m = month;
}
w = y + y /4 + c / 4 - 2 * c + 26 *(m + 1) / 10 + day -1;
if(w > 7)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
w = w % 7;
}
else //被除数为负数的情况
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
while(w < 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
w = w + 7;
}
}
cout << year << "年"<< month << "月"<<day <<"日" << "是"
<< Weekday[w];
}
void
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
Zeller();
}