用pascal找出今年每个月的13是星期几。

分析

按月计算,模拟运算,1900 65438+10月13为周六(代码1),下月13为代码(1+31-1) mod 7。

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

数据比较大的时候可以按年计算,每年365天,mod 7的余数是1,也就是说每年所有的日子和星期都错一天,闰年错1,二月错1,三月错两天。这样,只要先找到第一年的解,就可以把错位加到第二年。

详细分析:因为1900.1.1是星期一,所以1900.1.13等于(13-1) mod7+1=星期六。这个可能不太清楚。那么,我来解释一下:每七天就是一周。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,30,31,30,31

int b[8]={0}

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

b数组保存从周一到周日的天数。用date记录下星期几的代码,然后用两个循环依次把一个月中的日子相加,得出那个月是星期几。当然要注意判断闰年!知道了这个方法,就很容易实现了。

注意闰月。

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

也可以使用泽勒公式。

源代码

方法1

{不要用丘勒公式}

程序五001;

定义变量

wk:数组[0..6]的渴望;

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

开始

assign(输入,' Friday . in ');复位(输入);

assign(输出,' Friday . out ');重写(输出);

readln(n);

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

对于i:= 1900到1900+n-1 do

开始

对于j:= 1到12 do

开始

案例j

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

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

2 :if (i mod 4 = 0)和(I mod 100 & lt;& gt0)或(i mod 400 = 0)

那么天数:=29

else天数:= 28;

结束;

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

m:= days mod 7;

s:= NK;

如果s+m=7那么NK:= 7;

NK:=(m+s)mod 7;

结束;

结束;

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

关闭(输入);关闭(输出);

结束。

方法2

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

定义变量

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

a:数组[0..6]的渴望;

开始

Assign(输入,' Friday . in ');复位(输入);

Assign(输出,' Friday . out ');重写(输出);

readln(n);

对于i:=1900到1899+n do

对于j:=1到12 do

开始

年份:= I;

m:= j;

如果(m=1)或(m=2 ),则

开始

十二月(年);

m:= m+12;

结束;

c:=年分100;

y:=年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]);

结束;

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

关闭(输入);关闭(输出);

停止;

结束。