c语言13号星期几,用pascal求这一年中每个月的13号是星期几

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

ojus52

2013.07.17

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:56%    等级:12

已帮助:2995人

分析

按月为单位计算,模拟运算,1900年1月13日是星期六(代号1),下个月的13日就是代号(1+31-1) mod 7+1的星期。

因为数据小,所以不会超时。

当数据比较大时,可以以年为单位计算,每年为365天,mod 7的余数是1,就是说每过一年所有的日和星期错一天,闰年第1、2月错1天,3月以后错2天。这样,只要先求出第一年的解,错位添加到以后的年即可。

详细分析:因为1900.1.1是星期一,所以1900.1.13就等于(13-1) mod7+1=星期六。这样讲可能不太清楚。那么,我来解释一下:每过7天是一个星期。n天后是星期几怎么算呢?现在假设n是7的倍数,如果n为14,那么刚好就过了两个星期,所以14天后仍然是星期一。但如果是过了15天,那么推算就得到是星期二。这样,我们就可以推导出一个公式来计算。(n天 mod 7(一个星期的天数)+ 现在日期的代号) mod 7 就等于现在日期的代号。当括号内的值为7的倍数时,其代号就为0,那么,此时就应该是星期日这样,我们可以得出题目的算法:

int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}

int b[8]={0}

a数组保存一年12个月的天数(因为C语言中数组起始下标为0,所以这里定义为13)。

b数组保存星期一到星期日出现的天数。用date记录目前是星期几的代号,然后用两个循环,依次加上所经过的月份的天数,就出那个月是星期几,当然,要注意判断闰年!知道了这个方法,实现起来就很容易了。

注意考虑闰月的情况。

最后注意要换行,否则会错误。

还可利用蔡勒公式

源代码

方法1

{不用蔡勒公式}

program five001;

var

wk:array[0..6]of Longint;

n,i,j,x,s,days,nk,m:Longint;

begin

assign(input,'friday.in');reset(input);

assign(output,'friday.out');rewrite(output);

readln(n);

nk:=1;m:=0;x:=13 mod 7;

for i:= 1900 to 1900+n-1 do

begin

for j:= 1 to 12 do

begin

case j of

1,3,5,7,8,10,12 :days:=31;

4,6,9,11 :days:=30;

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

then days:=29

else days:=28;

end;

wk[(x+nk-1) mod 7]:=wk[(x+nk-1) mod 7]+1;

m:=days mod 7;

s:=nk;

if s+m=7 then nk:=7;

nk:=(m+s) mod 7;

end;

end;

writeln(wk[6],' ',wk[0],' ',wk[1],' ',wk[2],' ',wk[3],' ',wk[4],' ',wk[5]);

close(input);close(output);

end.

方法2

{根据蔡勒公式写的代码。}

var

n,i,j,year,m,c,y,w :longint;

a :array[0..6] of longint;

begin

Assign(input,'Friday.in');reset(input);

Assign(output,'Friday.out');rewrite(output);

readln(n);

for i:=1900 to 1899+n do

for j:=1 to 12 do

begin

year:=i;

m:=j;

if (m=1)or(m=2) then

begin

dec(year);

m:=m+12;

end;

c:=year div 100;

y:=year mod 100;

w:=(y+ y div 4 + c div 4 -2*c+ 26*(m+1) div 10 +13 -1) mod 7;

w:=(w+7) mod 7;

inc(a[w]);

end;

writeln(a[6],' ',a[0],' ',a[1],' ',a[2],' ',a[3],' ',a[4],' ',a[5]);

Close(input);close(output);

halt;

end.

35分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值