用pascal求这一年中每个月的13号是星期几Description编程统计:从1900年1月1日(星期一)开始经过的n年当中,每个月的13号这一天是星期一、星期二、星期三、……、星期日的次数分别是多少?(

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/11 13:35:58
用pascal求这一年中每个月的13号是星期几Description编程统计:从1900年1月1日(星期一)开始经过的n年当中,每个月的13号这一天是星期一、星期二、星期三、……、星期日的次数分别是多少?(

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

用pascal求这一年中每个月的13号是星期几Description编程统计:从1900年1月1日(星期一)开始经过的n年当中,每个月的13号这一天是星期一、星期二、星期三、……、星期日的次数分别是多少?(
分析
按月为单位计算,模拟运算,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.

用pascal求这一年中每个月的13号是星期几Description编程统计:从1900年1月1日(星期一)开始经过的n年当中,每个月的13号这一天是星期一、星期二、星期三、……、星期日的次数分别是多少?( pascal 第1题 13号星期几(riqi.pas)【问题描述】编程统计从1900年1月1日(当天是星期一)开始经过的N年当中,每个月的13号是星期一、星期二、星期三……星期日的次数分别是多少?【输入】共1行,1个 一年中有多少的月是31天? 一年中紫外线最强的是哪几个月 一年中找工作最好的时间是哪几个月? 一年中连续两个月都是大月的是() 一年中有几个月是31号? Free Pascal 和Pascal的区别?为什么竞赛都用Free Pascal?Free Pascal 和Pascal的区别?为什么竞赛都用Free Pascal? 在一年中,中国有多少节日是在1号?用英语将它们从元月到12月排序,并用正确的中文写出节日名称 一年中连续两个月是大月的是多少月和多少 一年中哪个月和哪个月是连续的两个大月. 九月是一年中第九个月.翻译 已知公元1年1月1日是星期一.任意输入一个年份和月份(公元1年1月以后),输出该月的日历表.用PASCAL语言 2012年中秋节是几月几号?9月30号. Miller-Rabbin素数测试法求一个用Miller-Rabbin算法判断是否为素数的程序,注意要用PascalPascal!Pascal!Pascal!Pascal!Pascal!Pascal!Pascal!Pascal!最好有说明 一年12个月的每个月 英文单词是? 广东一年中最冷的是哪几个月?一般农历几月最冷?一般什么时候回暖 12月22日,正午太阳高度达到一年中最大值的地区是?