求万年历星期数公式
各位,我手上有一道题:
已知公元1年的1月1日为星期一,则可以计算出任意公元X年的1月1日的星期数,计算方法如下:
平年365天,闰年比平年多1天。
X年的1月1日星期数=((x-1)*365+(X-1)/4-(X-1)/100+(X-1)/400+1)%7
我想问的是这个公式是正确的吗?谢谢!
问题点数:50、回复次数:9Top
1 楼fangrk(加把油,伙计!)回复于 2003-02-02 22:16:28 得分 20
#include <iostream>
#include <string>
using namespace std;
int dayOfWeek(int year,int month,int day);
int main()
{ int Y,M,D;
cout<<"Input year month and day:"<<endl;
cin>>Y>>M>>D;
const string week[7]=
{string("Sunday"),string("Monday"),string("Tuesday"),
string("Wednesday"),string("Thursday"),string("Friday"),
string("Saturday")};
cout<<"The date is "<<week[dayOfWeek(Y,M,D)];
}
int dayOfWeek(int year,int month,int day)
{ int _month[12]={31,0,31,30,31,30,31,31,
30,31,30,31};
if(year%4==0 && year%100!=0 || year%400==0)
_month[1]=29;
else _month[1]=28;
int C=0;
for(int i=0;i<month-1;++i)
C+=_month[i];
C+=day;
int S=year-1+(year-1)/4-(year-1)/100+(year-1)/400+C;
return S%7;
}Top
2 楼xdspower(杂食菜熊)回复于 2003-02-03 09:24:07 得分 10
不正确,因为在有公元纪年后,有几天是不存在的,你可以参考程序员杂志上的一篇文章,专门讲这个事情Top
3 楼fengyizu(简单do)回复于 2003-02-03 10:28:48 得分 0
xdspower大侠,我想问一下,参考哪一期的程序员杂志呀?
还有,这个公式,是我从别的学校大二课程设计指导书上抄下来的。只是抄的公式有几个地方没写清楚。所以这个公式应该没问题吧?
fangrk大侠,
我想你的代码里的day是否是date的意思呀?如果是这样,那么我这个公式就是正确的了。
谢谢两位!Top
4 楼wonita(我你他)回复于 2003-02-03 15:24:40 得分 0
upTop
5 楼fangrk(加把油,伙计!)回复于 2003-02-03 16:13:34 得分 0
int dayOfWeek(int year,int month,int day)
三个参数分别为年,月,日
返回的结果如果是0,代表星期天
返回的结果如果是1,代表星期一
返回的结果如果是2,代表星期二
……Top
6 楼allen1981813(Nahe des Geliebten)回复于 2003-02-03 16:17:55 得分 0
天数/7可以得到Top
7 楼giantzz(平庸无能的政府)回复于 2003-02-03 17:06:02 得分 0
N年前就知道了,对的Top
8 楼xdspower(杂食菜熊)回复于 2003-02-05 09:19:01 得分 0
好象是试刊,是2001年的!?记不起了。Top
9 楼pengtaodream(DRE@M)回复于 2003-02-05 15:04:29 得分 20
#include<iostream.h>
#include<iomanip.h>
//-----------------------------------------------------------------------
int weekday=0;
//-----------------------------------------------------------------------
int IsLeapYear(int y); //判断时不是润年
int FirstDayOfYear(int y); //判断每一年的第一天是星期几
void DisplayHead(int m); //打印月表头
void DisplayDay(); //显示每一天
int MonthDay(int m); //判断每一个月有几天
//-----------------------------------------------------------------------
void main()
{
int y=0;
cout<<"Please input year and press ENTER....";
cin>>y;
cout<<"\n\n\n\n\n "<<y<<" 年\n";
cout<<" ------------------------------------------------------------------\n";
cout<<" ------------------------------------------------------------------\n";
weekday=FirstDayOfYear(y);
DisplayDay();
}
//------------------------------------------------------------------------
int IsLeapYear(int y)//判断时不是润年
{
return((y%4==0)&&(y%100==0))||(y%400==0);
}
//-------------------------------------------------------------------------
int MonthDay(int m)//判断每一个月有几天
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31;
case 4:
case 6:
case 9:
case 11: return 30;
case 2:
if(IsLeapYear(m))
return 29;
else
return 28;
}
return 0;
}
//--------------------------------------------------------------------------
int FirstDayOfYear(int y)//判断每一年的第一天是星期几
{
long n=0;
for(int i=1;i<=y;i++)
{
if (IsLeapYear(i))
n+=366;
else
n+=365;
}
n=n%7;
return(n);
}
//--------------------------------------------------------------------------
void DisplayHead(int m)//打印月表头
{
cout<<"\n "<<m<<"MONTH SUN MON TUE THE FOU FRI SET"<<endl;
cout<<" ";
for(int i=0;i<weekday;i++)
cout<<" ";
}
//--------------------------------------------------------------------------
void DisplayDay()
{
for(int i=1;i<=12;i++)
{
DisplayHead(i);
for(int d=1;d<=MonthDay(i);d++)
{
weekday=(weekday+1)%7;
if((weekday%=7)==0)
cout<<"\n"<<" ";
else if(weekday<10)
cout<<" "<<d;
else
cout<<" "<<d;
}
}
}
//---------------------------------------------------------------------------
Top




