CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

求万年历星期数公式

楼主fengyizu(简单do)2003-02-02 22:06:43 在 C/C++ / C语言 提问

各位,我手上有一道题:  
  已知公元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

相关问题

  • 万年历!!
  • 万年历的实现
  • 万年历 + 节日提醒
  • 怎样作万年历?
  • 谁有 万年历源码?
  • 能否提供万年历的控件或源码,最好支持中国老皇历的显示(包括皇历数据库)???
  • 请教万年历的核心算法?
  • 请问万年历是怎样做的?
  • 求用c#写的万年历代码
  • 有关万年历问题求教!

关键词

  • 1月1日
  • 星期数
  • 判断
  • cout
  • include

得分解答快速导航

  • 帖主:fengyizu
  • fangrk
  • xdspower
  • pengtaodream

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo