博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

万年历问题

Posted on 2010-10-19 21:37  桃子在路上  阅读(305)  评论(0编辑  收藏  举报

【题目】输入年、月、日,求这一天是星期几。

【参考程序1】

【算法提要】求出这一天离公元1年的元旦有多少天days,然后对7求余

const

first=1; {公元1年为基准}

first_week=1; {公元1年的元旦为星期一}

yue:array[1..12] of 1..31=(31,28,31,30,31,30,31,31,30,31,30,31);

week_:array[0..6] of string[20] =('Sunday','Monday','Tuesday','Wedsday',

'Thursday','Friday','Saturday');

var

days,week,year,month,date,i,years:longint;

begin

writeln('year:');readln(year);

writeln('month');readln(month);                        

writeln('date');readln(date);

years:=0; days:=0;

for i:=first to year-1 do

if (i mod 400=0) or (i mod 4=0) and (i mod 100<>0) then

begin years:=years+1;end; {注意处理闰年的情况}

days:=(year-first)*365+years; {离基准年过了多少天}

for i:=1 to month-1 do days:=days+yue[i]; {本年过了多少个月}

for i:=1 to date do days:=days+1; {本月过了多少天}

if ((year mod 400=0) or (year mod 4=0) and (year mod 100<>0))

and (month>3) then days:=days+1; {如果本年为闰年,且月份超2月,

还要考虑加1}

week:=((days-1) mod 7 +first_week ) mod 7; {求星期数}

writeln('it is ',week_[week]);

readln;

end.

【参考程序2】 用公式法: days:=trunc((year-1)*(1+1/4-1/100+1/400)+c)

用求出的days对7求余数。其中c为该天离该年元旦的天数

const

first=1;

first_week=1;

yue:array[1..12] of 1..31=(31,28,31,30,31,30,31,31,30,31,30,31);

week_:array[0..6] of string[20] =('Sunday','Monday','Tuesday','Wedsday',

'Thursday','Friday','Saturday');

var

days,week,year,month,date,i:longint;

begin

writeln('year:');readln(year);

writeln('month');readln(month);

writeln('date');readln(date);

days:=0;

for i:=1 to month-1 do days:=days+yue[i];

for i:=1 to date do days:=days+1;

if ((year mod 400=0) or (year mod 4=0) and (year mod 100<>0))

and (month>3) then days:=days+1;

days:=trunc((year-1)*(1+1/4-1/100+1/400)+days);

week:=days mod 7;

writeln('it is ',week_[week]);

readln;

end.