求日期的问题

qqibrow 2009-09-26 08:00:00
求一算法,知道系统日期xxxx年xx月xx日星期几,求任意输入日期xx年xx月xx日是星期几?
(勿忘润年奥)
...全文
96 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyangdn 2009-09-27
  • 打赏
  • 举报
回复
地球绕太阳公转时间 = 1回归年 = 365.24220日 = 365日5小时48分45.5秒。
365.24220 * 4 = 1460.9688 约1461 四年后多出一天 差值为 0.0312
365.24220 * 100 = 36524.22 = 1461 * 25 - 0.78 = 1461 * 25 - 1 + 0.22
如果按此计算100年后少了0.78天,所以被100整除不算闰年, 但是每100年有0.22天的差值
365.24220 * 400 = 146096.88 = (1461 * 25 - 1) * 4 + 0.88 = (1461 * 25 - 1) * 4 + 1 - 0.12
400年后产生进位,被400整除为闰年,但是每400年少了0.12天
同理 8个400年后即3200年后,少了0.96天产生进位(少了一天),但是又有0.04的差值
同理 25个3200年后产生进位要多加一天
feiyangdn 2009-09-27
  • 打赏
  • 举报
回复
代码里面不能加颜色?
feiyangdn 2009-09-27
  • 打赏
  • 举报
回复
少了个判断
#include <iostream.h>
int weekofdate(int year,int month,int day)
{
int days = month > 2 ? -2:0;
days += month > 2 && ((year%4) == 0 && ((year%100) != 0 || (year%400) == 0)) ? 1 : 0;//今年是闰年且2月份之后了,把2月份当做30天计算,但是要减1,否则减2
year-- ;
days += year*365 + year/4 - year/100 + year/400;//总共已经过了多少个闰年
days += 30 * (month - 1) + (month/2);
days += (month == 9) ? 1 : 0; //9月份特殊,9月前有5个31天的,其他月前都最多month/2个31天的
return (days + day) % 7;//1年1月1日是星期一
}
int main()
{
int year,month,day,week;

cin>>year>>month>>day;
week = weekofdate(year,month,day);//用0到6表示星期日到星期六
switch(week)
{
case 0:
cout<<"星期日"<<endl;
break;
default :
cout<<"星期"<<week<<endl;
break;
}

return 0;
}
zhouxianglh 2009-09-27
  • 打赏
  • 举报
回复
Calendar.get(Calendar.DAY_OF_WEEK)


Java 里可以用它。
feiyangdn 2009-09-27
  • 打赏
  • 举报
回复
#include <iostream.h>
int weekofdate(int year,int month,int day)
{
int days = month > 2 ? 0:2;
days += ((year%4) == 0 && ((year%100) != 0 || (year%400) == 0)) ? -1 : -2;//今年是闰年且2月份之后了,把2月份当做30天计算,但是要减1,否则减2
year-- ;
days += year*365 + year/4 - year/100 + year/400;//总共已经过了多少个闰年
days += 30 * (month - 1) + (month/2);
days += (month == 9) ? 1 : 0; //9月份特殊,9月前有5个31天的,其他月前都最多month/2个31天的
return (days + day) % 7;//1年1月1日是星期一
}
int main()
{
int year,month,day,week;

cin>>year>>month>>day;
week = weekofdate(year,month,day);//用0到6表示星期日到星期六
switch(week)
{
case 0:
cout<<"星期日"<<endl;
break;
default :
cout<<"星期"<<week<<endl;
break;
}

return 0;
}
hhhcj 2009-09-27
  • 打赏
  • 举报
回复
#include <iostream>
#include <ctime>
using namespace std;

int offsetDay(int year,int month,int day)
{
int i,days=0;
for(i=1;i<month;i++)
{
switch(i)
{
case 2:
days+=(year%4==0&&year%100!=0?29:28);
break;
case 4:
case 6:
case 9:
case 11:
days+=30;
break;
default:
days+=31;
}
}
return days+day-1;//从1月1日到1月1日的offsetDay是0
}

int main()
{
int i,baseDay=27,baseMonth=9,baseYear=2009,baseWeek=7;//2009年9月27日星期七
int inputYear,inputMonth,inputDay,week,dayGap;

cin>>inputYear>>inputMonth>>inputDay;
dayGap=0;
if(inputYear>=baseYear)
{
for(i=baseYear;i<inputYear;i++)
dayGap+=(i%4==0&&i%100!=0?366:365);
dayGap+=offsetDay(inputYear,inputMonth,inputDay)-offsetDay(baseYear,baseMonth,baseDay);
}
else
{
for(i=inputYear;i<baseYear;i++)
dayGap-=(i%4==0&&i%100!=0?366:365);
dayGap-=offsetDay(inputYear,inputMonth,inputDay)-offsetDay(baseYear,baseMonth,baseDay);
}
week=(baseWeek+dayGap)%7;
cout<<(week>0?week:7+week)<<endl;

system("pause");
return 0;
}
hhhcj 2009-09-26
  • 打赏
  • 举报
回复
头像越界了
hhhcj 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 peacefulby 的回复:]
搜万年历算法吧,自己写一个也成,注意下闰年的2月,其他的没什么了
ps,lz的头像为毛这么大……
[/Quote]
UP
gumbour 2009-09-26
  • 打赏
  • 举报
回复
这题目麻烦但是很简单。
只是要考虑的因素比较多
一 1,3,5,7,8,10,12月是31天
4,6,9,11月是11天
2月是28或者29天

二 闰年计算
  ①、普通年能被4整除而不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年) 
  ②、世纪年能被400整除而不能被3200整除的为闰年。(如2000年是闰年,3200年不是闰年)
  ③、对于数值很大的年份能整除3200,但同时又能整除86400则又是闰年.(如86400年是闰年)
事实上,四位数忽略③即可

根据上面2点算出2个时刻之间相差的天数,模7计算就行。
PeacefulBY 2009-09-26
  • 打赏
  • 举报
回复
搜万年历算法吧,自己写一个也成,注意下闰年的2月,其他的没什么了
ps,lz的头像为毛这么大……

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧