Zeller公式及其c++实现

来源:互联网 发布:qq软件升级 编辑:程序博客网 时间:2024/04/28 03:28
蔡勒公式
蔡勒(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()
{
    
string Weekday[7=
    
{
        
"星期日","星期一","星期二",
        
"星期三","星期四","星期五",
        
"星期六"
    }
;
    
int Month[12=
    
{
        
31,28,31,30,31,30,31,31,20,31,30,31
    }
;
    
int year, month, day,w,c,y,m,d ;
    
do{
        cout 
<< "请输入年份:" << endl;
        cin 
>> year;
    }

    
while(year > 10000 && year <= 1582);
    
if( (year % 4 == 0 && year % 100 != 0|| (year % 400 == 0) ) //判断闰年的情况
    
{
        Month[
1= 29;
    }

    
do{
        cout 
<< "请输入月份:" << endl;
        cin 
>> month;
    }

    
while(month > 12 || month <= 0);

    
do{
        cout 
<< "请输入日期:" << endl;
        cin 
>> day;
    }

    
while(day > Month[month - 1|| day <= 0);
    
//使用蔡勒(Zeller)公式计算星期几,1582年后有效
    if( month <= 2)            //1,2 月看做上一年的 13,14 月
    {
        c 
= (year - 1/ 100;
        y 
= (year - 1% 100
        m 
= month + 12;
    }

    
else
    
{
        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)
    

        w 
= w % 7;
    }

    
else  //被除数为负数的情况       
    {
        
while(w < 0)
        
{
            w 
= w + 7;
        }

    }

    cout 
<< year << ""<< month << ""<<day <<"" << ""
        
<< Weekday[w];
}

void main()
{
    Zeller();
}
 
原创粉丝点击