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

Description

编程统计:从1900年1月1日(星期一)开始经过的n年当中,每个月的13号这一天是星期一、星期二、星期三、……、星期日的次数分别是多少?
(提示:年份能被4整除而不能被100整除的是闰年;或者年份能被400整除的是闰年。)

Input

整数N(1<=n<=400)

Output

一行7个整数,以空格相隔,
(依次是星期一、星期二、星期三、……、星期日的次数)

Sample Input

1
Sample Output

1 3 1 2 2 2 1
有完整的源程序,或者写出主程序的精髓部分(核心部分),最好有解释。

那位 Comxtohr 回答的很不错,哈哈,继续征集哦,不然25分就给他咯

分析

按月为单位计算,模拟运算,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.追问

你的输出格式咋不满足我的呢?改改行吗?

追答

方法一中的
writeln(wk[6],' ',wk[0],' ',wk[1],' ',wk[2],' ',wk[3],' ',wk[4],' ',wk[5]);
改成
writeln(wk[1],' ',wk[2],' ',wk[3],' ',wk[4],' ',wk[5],' ',wk[6],' ',wk[0]);
方法二中的
writeln(a[6],' ',a[0],' ',a[1],' ',a[2],' ',a[3],' ',a[4],' ',a[5]);
改成
writeln(a[1],' ',a[2],' ',a[3],' ',a[4],' ',a[5],' ',a[6],' ',a[0]);
就行了

追问

谢谢啊

追答

同学,把分给我吧!

温馨提示:答案为网友推荐,仅供参考