用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]);
关闭(输入);关闭(输出);
停止;
结束。