




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录CS41:判断闰年1CS42:细菌繁殖3CS43:日历问题5CS44:玛雅历7CS45:时区间时间的转换9CS46:不吉利的日期14CS47:特殊日历计算15《算法与程序实践》习题解答4——日期和时间处理在很多具体的程序设计中,经常会遇到与日期和时间处理相关的问题。首先我们来了解一下日期和时间格式。世界各地有多种格式来表示日期和时间。对于日期的常用格式,在中国常采用格式的是“年年年年/月月/日日”或写为英语缩略表示的”yyyy/mm/dd”,而北美所用的日期格式则为“月月/日日/年年年年”或”mm/dd/yyyy”,如将“2009/11/07”改成这种格式,对应的则是”11/07/2009”。对于时间的格式,则常有12小时制和24小时制的表示方法,24小时制用0-24来表示一天中的24小时,而12小时制只采用1-12表示小时,再加上am/pm来表示上午或下午,比如”17:30:00”是采用24小时制来表示时间,而对应的12小时制的表示方法是”05:30:00pm”基本思想:这类问题一般会涉及到不同日历表示法之间的相互转换。解决此类问题的基本思想是找到一种公共的基准,并通过基准进行不同日历之间的转换。日期和时间处理问题一般不涉及很难的算法,但有时会有一些特殊情况需要处理,如果考虑不到就会出错。因此需要一些耐心处理细节问题,可以比较好地训练编程的严谨性。下面通过一些具体的实例说明日期和时间处理上的常见问题及其解答。对于每一道例题,我们将给出问题描述、输入输出要求、输入输出样例、解题思路、参考程序和实现中常见的问题。CS41:判断闰年(来源:2733)问题描述:判断某年是否是闰年。公历纪年法中,能被4整除的大多是闰年,但能被100整除而不能被400整除的年份不是闰年,如1900年是平年,2000年是闰年。输入:输入数据一行,仅含一个整数a(0<a<3000)。输出:输出要求一行,如果公元a年是闰年输出Y,否则输出N。输入样例:2006输出样例:N解题思路:这个题目主要考察闰年的定义,使用基本的逻辑判断语句就可以了。考虑到输入的范围在0到3000之间,所以判断闰年时不必考虑能被3200整除的年份不是闰年的判定条件。程序应该包括三个基本的步骤:正确读入要判定的年份a;判定a是否为闰年;给出正确的输出。闰年的判定方法判定公历闰年遵循的一般规律为:四年一闰,百年不闰,四百年再闰.公历闰年的精确计算方法(按一回归年365天5小时48分45.5秒)①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48'45.5''计算)。此外,如依照现有太阳年的长度与上述闰年规则,每8000年又约差一日,因此约翰·赫歇尔提议每逢4000的倍数不闰,如西元4000年。但距此一年份来临尚有约二千年之遥,因此还未曾真正纳入规则或实施过。又由于地球公转速率的不稳定与众多影响因素,届时是否需要纳入此规则仍有疑问。原因:若一年按365天5h48'46''(此时86400年也是闰年)计算,一年日数必须是整数,不便将零时数计入,所以取365天为一年,则余5时48分46秒,积至4年约满一日,所以4年一“闰日”,谓之“闰年”,无“闰日”之年为平年,即平年365天,闰年366天。但到4年之时,仅有23时15分4秒闰一日,欠缺44分56秒;积至100年(25闰)时就欠缺18时43分20秒,约合3/4日,所以满100年不闰;此时又余5时16分40秒,积至400年余21时6分40秒又闰;又欠缺2时53分20秒,积至3200年计欠缺23时6分40秒,所以满3200年不闰;此时又余53分20秒,积至86400年刚好24时又一闰,这是不余不欠,需重计算,所以按阳历计算就有上面的闰年规则。按一回归年365天5h48'45.5''计算:3200年多出16000小时153600分145600秒=18600小时26分40秒,共32*24+8=136个闰年=776*24=18624小时>18600小时,所以只能算到775个闰年,3200不是闰年,于是775*24=18600,多出了26分40秒怎么办需要多少个周期弥补?答案是54个周期,为172800年,因为172800/3200=54个周期54*26分40秒=1404分2160秒=24小时。公元前闰年规则1,非整百年:年数除以4余数为1是闰年,即公元前1、5、9……年;2,整百年:年数除以400余数为1是闰年,年数除以3200余数为1,不是闰年,年数除以172800余1又为闰年,即公元前401、801……年。其中,判断输入年份是否为闰年根据个人的思考习惯可以有不同的判定顺序。参考解法一:分段排除:如果a%4!=0,则a不是闰年;否则如果a%100==0&&a%400!=0,则a不是闰年;否则a是闰年。参考解法二:列出所有闰年的可能条件,满足条件则为闰年,否则判为非闰年:如果(a%400==0||(a%4==0&&a%100!=0)),则a是闰年;否则a不是闰年。参考程序1:#include<stdio.h>intmain(){ inta; scanf("%d",&a); if(a%4!=0) printf("N\n"); elseif(a%100==0&&a%400!=0) printf("N\n"); else printf("Y\n"); return0;}参考程序2:#include<stdio.h>intmain(){ inta; scanf("%d",&a); if((a%4==0&&a%100!=0)||a%400==0) printf("Y\n"); else printf("N\n"); return0;}CS42:细菌繁殖(来源:2712)问题描述:一种细菌的繁殖速度是每天成倍增长。例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。输入:第一行有一个整数n,表示测试数据的数目。其后n行每行有5个整数,整数之间用一个空格隔开。第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的数目,第四个数表示要求的那一天的月份,第五个数表示要求的那一天的日期。已知第一天和要求的一天在同一年并且该年不是闰年,要求的一天一定在第一天之后。数据保证要求的一天的细菌数目在整数范围内。输出:对于每一组测试数据,输出一行,该行包含一个整数,为要求的一天的细菌数。输入样例:2111122281032输出样例:240解题思路:这题实际上是求给定的两天之间间隔的天数n,第一天的细菌数乘以2的n次方就是题目的答案。每个月的天数因为不很规则,如果在程序中用规则描述会比较麻烦,所以可以使用一个数组将每个月的天数存起来。整个计算过程可以描述如下:读入测试样例数n;做n次:1.读入两个日期及第一天的细菌数; 2.将两个日期转换为当年的第几天; 3.得到两个天数的差,即它们中间间隔的天数m; 4.用第一天的细菌数乘以2的m次方等到x; 5.输出x;思考题:如果要求的最终细菌数目可能超过整数所能表示的范围,此题该如何解决?参考程序1:#include<stdio.h>intmain(){ intdays[12]={31,28,31,30,31,30,31,31,30,31,30,31}; intn; inti,j; scanf("%d",&n); for(i=0;i<n;i++) { intmonth_1,day_1,month_2,day_2,num; scanf("%d%d%d%d%d",&month_1,&day_1,&num,&month_2,&day_2); intsum=0; for(j=month_1;j<month_2;j++) sum+=days[j-1]; sum-=day_1; sum+=day_2; longnNum=num; for(j=0;j<sum;j++) nNum*=2; printf("%ld\n",nNum); } return0;}参考程序2:#include<stdio.h>intdays[]={0,31,28,31,30,31,30,31,31,30,31,30,31};intmain(){ intn; inti; intmon1,date1,mon2,date2,num1; scanf("%d",&n); while(n--) { scanf("%d%d%d%d%d",&mon1,&date1,&num1,&mon2,&date2); intsum=date2-date1; for(i=mon1;i<mon2;i++) sum+=days[i]; longnum=num1; for(i=0;i<sum;i++) num*=2; printf("%ld\n",num); } return0;}CS43:日历问题(来源:2964)问题描述:在我们现在使用的日历中,闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700,1800,1900和2100不是闰年,而1600,2000和2400是闰年。给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。输入:输入包含若干行,每行包含一个正整数,表示从2000年1月1日输出:对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DDDayOfWeek”,其中“DayOfWeek”必须是下面中的一个:“Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”and“Saturday”。样例输入:1730174017501751-1样例输出:2004-09-26Sunday2004-10-06Wednesday2004-10-16Saturday2004-10-17Sunday解题思路:这道题目使用的背景知识是闰年的定义和公历日历中一年12个月中每个月的日期数。根据题目要求,所有涉及的数值都是用整数可以表示的。这个问题可以分解成两个彼此独立的问题:一个是要求的那天是星期几,另一是要求的那天是哪年哪月那天。第一个问题比较简单,知道2000年1月1日是星期几后,只要用给定的日期对7取模,就可以知道要求的一天是星期几。第二个问题相对麻烦一些。我们用year,month,date分别表示要求的日期的年、月、日。当输入一个整数n时,如果n大于等于一年的天数,就用n减去一年的天数,直到n比一年的天数少(这时假设剩下天数为m),一共减去多少年year就等于多少;如果m大于等于一个月的天数,就用m减去一个月的天数,直到m比一个月的天数少(这时假设剩下的天数为k),一共减去多少个月month参考程序:#include<stdio.h>inttype(int);//函数声明charweek[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};intyear[2]={365,366};//非闰年的天数、闰年的天数intmonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};intmain(){ intdays,dayofweek;//days表示输入的天数,dayofweek表示星期几 inti=0,j=0; //freopen("in.txt","r",stdin); while(scanf("%d",&days)&&days!=-1) { dayofweek=days%7; for(i=2000;days>=year[type(i)];i++) days-=year[type(i)]; for(j=0;days>=month[type(i)][j];j++) days-=month[type(i)][j]; printf("%d-%02d-%02d%s\n",i,j+1,days+1,week[dayofweek]); } return0;}inttype(intm)//判断第m年是否为闰年,是则返回1,否则返回0{ if(m%4!=0||(m%100==0&&m%400!=0))return0; else return1;}注意事项:问题一:逻辑过于复杂,导致程序出错。问题二:没有将判断闰年的代码抽象成函数,使得主程序代码不够清晰。问题三:多数出错的地方在于算出从2000年到当前年经历了多少个闰年。很多同学都错在多算一个或者少算一个。另外计算闰年不能用循环,否则会超时。CS44:玛雅历(来源:2965)问题描述:上周末,M.A.教授对古老的玛雅有了一个重大发现。从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的日历。这个Haab日历拥有19个月,在开始的18个月,一个月有20天,月份的名字分别是pop,no,zip,zotz,tzec,xul,yoxkin,mol,chen,yax,zac,ceh,mac,kankin,muan,pax,koyab,cumhu。这些月份中的日期用0到19表示。Haab历的最后一个月叫做uayet,它只有5天,用0到4表示。玛雅人认为这个日期最少的月份是不吉利的,在这个月法庭不开庭,人们不从事交易,甚至没有人打扫屋中的走廊。因为宗教的原因,玛雅人还使用了另一个日历,在这个日历中年被称为Tzolkin(holly年),一年被分成13个不同的时期,每个时期有20天,每一天用一个数字和一个单词相组合的形式来表示。使用的数字是1~13,使用的单词共有20个,它们分别是:imix,ik,akbal,kan,chicchan,cimi,manik,lamat,muluk,ok,chuen,eb,ben,ix,mem,cib,caban,eznab,canac,ahau。注意:一年中的每一天都有着明确的描述,比如,在一年的开始,日期如下描述:1imix,2ik,3akbal,4kan,5chicchan,6cimi,7manik,8lamat,9muluk,10ok,11chuen,12eb,13ben,1ix,2mem,3cib,4caban,5eznab,6canac,7ahau,,8imix,9ik,10akbal,...。也就是说数字和单词各自独立循环使用。Haab历和Tzolkin历中的年都用数字0,1,…表示,数字0表示世界的开始。所以第一天被表示成:Haab:0.pop0Tzolkin:1imix0请帮助M.A.教授写一个程序可以把Haab历转化成Tzolkin历。输入:Haab历中的数据由如下的方式表示:日期.月份年数第一行表示要转化的Haab历的数据量。下面的每一行表示一个日期,年数小于5000。输出:Tzolkin历中的数据由如下的方式表示:天数字天名称年数第一行表示需要转化的Haab历的数据量。下面的每一行表示一个日期。样例输入:310.zac00.pop010.zac1995样例输出:33chuen01imix09cimi2801解题思路:这道题问的是如何将Haab历的日期转换为Tzolkin历的日期。首先我们要搞清楚这两种日历记述日期的规则。Haab历每年365天,分成19个月,前18个月每月20天,第19个月有5天,19个月的名字分别用不同的字符串表示。每个月的日期是从0开始顺序记录的。若要计算出某个月的某一天是当年的第几天,可以将相应的月份用0~18表示,然后通过公式:月份*20+日期+1来计算。Tzolkin历一年有260天,每个日期由数字部分和字符串部分组合而成。日期部分从1~13循环使用,字符串部分由20个不同的字符串循环取出使用。可以看出,Tzolkin历中的日期的两个组成部分是彼此独立的,对于一年中的某一天,可以分别求出其数字部分和字符串部分,然后将其简单组合起来。这里正好260是13和20的最小公倍数,所以一年中没有两天是一样的,并且数字和字符串的所有组合都被用来表示一年的某一天了。接下来我们可以分析一下题目的具体解法。总的思路是首先计算出给出的Haab历表示的日期是世界开始后的第几天(假设是k),然后用k除以260得到Tzolkin历的年份,再用k对260取模得到m,用m分别对13和20取模得到d和s,d和Tzolkin历中第s个字符串的组合就是要求的日期。这里需要注意的是如果我们把世界的第1天用0表示,第260天用259表示,则正好用这个数字除以260得到Tzolkin历的年份,m对13取模后得到0到12的值,这个值要加1才能用于表示Tzolkin历的日期,同时m对20取模后得到0~19的数值,分别表示取20个字符串中的一个。如果我们用字符串数组来存储这20个字符串,则0~19的取值正好对应需要的字符串的数组下标。参考程序:#include<stdio.h>#include<string.h>constintNAMELEN=10;charmonth1[19][NAMELEN]={ "pop","no","zip","zotz","tzec","xul","yoxkin","mol","chen","yax","zac", "ceh","mac","kankin","muan","pax","koyab","cumhu","uayet"};charmonth2[20][NAMELEN]={ "imix","ik","akbal","kan","chicchan","cimi","manik","lamat","muluk", "ok","chuen","eb","ben","ix","mem","cib","caban","eznab","canac","ahau"};intmain(){ intnCase,i,m; //freopen("in.txt","r",stdin); scanf("%d",&nCase); printf("%d\n",nCase); for(i=0;i<nCase;i++) { intday,year,dates; charmonth[NAMELEN]; scanf("%d.%s%d",&day,month,&year);//读出Haab历的年月日 for(m=0;m<19;m++) if(!strcmp(month1[m],month))break;//找到月份对应的数字 dates=year*365+m*20+day;//计算距离世界开始的天数,从0卡是 printf("%d%s%d\n",1+dates%13,month2[dates%20],dates/260); } return0;}注意事项:问题一:一个非常不起眼,但却不容易查出来的问题是,有人在建立月份名称数组时,将个别月份的名字敲错了一两个字母,导致程序运行出错。问题二:有些人在计算Tzolkin历时,把程序中的1+dates%13写成(dates+1)%13,导致本应该从1~13的数变成0~12的数。CS45:时区间时间的转换(来源:2966)问题描述:直到19世纪,时间校准是一个纯粹的地方现象。每一个村庄当太阳升到最高点的时候把他们的时钟调到中午12点。一个钟表制造商人家或者村里主表的时间被认为是官方时间,市民们把自家的钟表和这个时间对齐。每周一些热心的市民会带着时间标准的表,游走大街小巷为其他市民对表。在城市之间旅游的话,在到达新地方的时候需要把怀表校准。但是,当铁路投入使用之后,越来越多的人频繁地长距离地往来,时间变得越来越重要。在铁路的早期,时刻表非常让人迷惑,每一个所谓的停靠时间都是基于停靠地点的当地时间。时间的标准化对于铁路的高效运营变得非常重要。在1878年,加拿大人SirSanfordFleming提议使用一个全球的时区(这个建议被采纳,并衍生了今天我们所使用的全球时区的概念),他建议把世界分成24个时区,每一个跨越15度经线(因为地球的经度360度,划分成24块后,一块为15度)。SirSanfordFleming的方法解决了一个全球性的时间混乱的问题。美国铁路公司于1883年11月18日使用了Fleming提议的时间方式。1884年一个国际子午线会议在华盛顿召开,他的目的是选择一个合适的本初子午线。大会最终选定了格林威治为标准的0度。尽管时区被确定了下来,但是各个国家并没有立刻更改他们的时间规范,在美国,尽管到1895年已经有很多州开始使用标准时区时间,国会直到1918年才强制使用会议制定的时间规范。今天各个国家使用的是一个Fleming时区规范的一个变种,中国一共跨越了5个时区,但是使用了一个统一的时间规范,比CoordinatedUniversalTime(UTC,格林威制时间)早8个小时。俄罗斯也拥护这个时区规范,尽管整个国家使用的时间和标准时区提前了1个小时。澳大利亚使用3个时区,其中主时区提前于他按Fleming规范的时区半小时。很多中东国家也使用了半时时区(即不是按照Fleming的24个整数时区)。因为时区是对经度进行划分,在南极或者北极工作的科学家直接使用了UTC时间,否则南极大陆将被分解成24个时区。时区的转化表如下:UTC(CoordinatedUniversalTime)GMT(GreenwichMeanTime),定义为UTC小时BST(BritishSummerTime),定义为UTC+1小时IST(IrishSummerTime),定义为UTC+1小时WET(WesternEuropeTime),定义为UTC小时WEST(WesternEuropeSummerTime),定义为UTC+1小时CET(CentralEuropeTime),定义为UTC+1小时CEST(CentralEuropeSummerTime),定义为UTC+2小时EET(EasternEuropeTime),定义为UTC+2小时EEST(EasternEuropeSummerTime),定义为UTC+3小时MSK(MoscowTime),定义为UTC+3小时MSD(MoscowSummerTime),定义为UTC+4小时AST(AtlanticStandardTime),定义为UTC-4小时ADT(AtlanticDaylightTime),定义为UTC-3小时NST(NewfoundlandStandardTime),定义为UTC-3.5小时NDT(NewfoundlandDaylightTime),定义为UTC-2.5小时EST(EasternStandardTime),定义为UTC-5小时EDT(EasternDaylightSavingTime),定义为UTC-4小时CST(CentralStandardTime),定义为UTC-6小时CDT(CentralDaylightSavingTime),定义为UTC-5小时MST(MountainStandardTime),定义为UTC-7小时MDT(MountainDaylightSavingTime),定义为UTC-6小时PST(PacificStandardTime),定义为UTC-8小时PDT(PacificDaylightSavingTime),定义为UTC-7小时HST(HawaiianStandardTime),定义为UTC-10小时AKST(AlaskaStandardTime),定义为UTC-9小时AKDT(AlaskaStandardDaylightSavingTime),定义为UTC-8小时AEST(AustralianEasternStandardTime),定义为UTC+10小时AEDT(AustralianEasternDaylightTime),定义为UTC+11小时ACST(AustralianCentralStandardTime),定义为UTC+9.5小时ACDT(AustralianCentralDaylightTime),定义为UTC+10.5小时AWST(AustralianWesternStandardTime),定义为UTC+8小时下面给出了一些时间,请在不同时区之间进行转化。输入:输入的第一行包含了一个整数N,表示有N组测试数据。接下来N行,每一行包括一个时间和两个时区的缩写,它们之间用空格隔开。时间由标准的a.m./p.m给出。midnight表示晚上12点(12:00a.m.),noon表示中午12点(12:00p.m.)。输出:假设输入行给出的时间是在第一个时区中的标准时间,要求输出这个时间在第二个时区中的标准时间。样例输入:4noonHSTCEST11:29a.m.ESTGMT6:01p.m.CSTUTC12:40p.m.ADTMSK样例输出:midnight4:29p.m.12:01a.m.6:40p.m.解题思路:这个题目要求在两个时区之间进行时间的转换。我们根据每个时区与格林威治时间的转换公式可以推算出两个时区之间的差别。问题的解决方法不难想到,只是日期处理类问题具有共同的特点就是输入输出比较麻烦,有一些需要特殊处理的情况,例如转换后多出一天或少了一天的情况需要处理。具体到这个题目来说:输入时,除了一般的时间表示法:时:分a.m/p.m.之外,要特殊处理noon和midnight;在直接通过格林威治时间进行转换后,要判断是否超过一天或减少了一天的情况;在输出时间时,要对noon和midnight进行特殊处理。解决这个问题时,关键的是确定两个时区之间的时差。因为时区是用字符串形式给出的,所以要先将时区对应到该时区与格林威治时间的时差上。有了每个时区与格林威治时间的时差,就可以计算任意两个时区之间的时差。参考程序:#include<stdio.h>#include<string.h>intdifference(char*zone1,char*zone2)//计算两个时区之间的时差,以分钟为单位{ char*zone[32]={"UTC", "GMT","BST","IST","WET","WEST", "CET","CEST","EET","EEST","MSK", "MSD","AST","ADT","NST","NDT","EST","EDT","CST","CDT","MST","MDT","PST","PDT","HST","AKST","AKDT","AEST","AEDT","ACST","ACDT","AWST"}; floattime[32]={0,0,1,1,0,1,1,2,2,3,3,4,-4,-3,-3.5,-2.5,-5,-4,-6,-5,-7, -6,-8,-7,-10,-9,-8,10,11,9.5,10.5,8}; inti,j; for(i=0;strcmp(zone[i],zone1);i++);//找到第一个时区对应的位置 for(j=0;strcmp(zone[j],zone2);j++);//找到第二个时区对应的位置 return(int)((time[i]-time[j])*60);}intmain(){ intnCase; inti; //freopen("in.txt","r",stdin); scanf("%d",&nCase); for(i=0;i<nCase;i++) { chartime[9]; inthours,minutes; scanf("%s",time);//读入时间 switch(time[0]) { case'n': hours=12;//输入noon minutes=0; break; case'm': hours=0;//输入midnight minutes=0; break; default: sscanf(time,"%d:%d",&hours,&minutes); hours%=12; scanf("%s",time); if(time[0]=='p') hours+=12; } chartimezone1[5],timezone2[5]; scanf("%s%s",timezone1,timezone2);//读入时区 intnewTime;//以分钟为单位 newTime=hours*60+minutes+difference(timezone2,timezone1); if(newTime<0)newTime+=1440;//提前一天,将负的时间加上一天 newTime%=1440;//如果超过一天,将一天的时间减去 switch(newTime) { case0: printf("midnight\n"); break; case720: printf("noon\n"); break; default: hours=newTime/60; minutes=newTime%60; if(hours==0) printf("12:%02da.m.\n",minutes); elseif(hours<12) printf("%d:%02da.m.\n",hours,minutes); elseif(hours==12) printf("12:%02dp.m.\n",minutes); else printf("%d:%02dp.m.\n",hours%12,minutes); } } return0;}注意事项:问题一:有人在处理时区名称和时差的对应关系时,不会用数组元素及其下标的方法处理,而是用一连串的ifelse语句逐一判定,造成代码冗余,增大了出错的机会;问题二:对特殊时间点的表示有理解上的问题。12:01am表示凌点1分,12:01pm表示中午12点1分;中午输出noon,凌晨输出midnight;问题三:向前走了一天和推后了一天的情况没考虑到。问题四:将12小时制换算成24小时制,然后根据时区关系作时间变换,再由24小时制换算成12小时制,注意当有半个小时的差别时,分钟的数值的调整最容易出错。CS46:不吉利的日期(来源:2723)问题描述:在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一定不是闰年,求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1~7)输入:输入有一行,即一月一日星期几(w)。(1<=w<=7)输出:输出有一到多行,每行一个月份,表示该月的13日是星期五。样例输入:7样例输出:110参考程序1(zzg):#include<stdio.h>intmain(){ intw;//读入星期 intdays;//保存天数 inti;//循环变量 intdates[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; while(scanf("%d",&w)!=EOF) { days=12; for(i=1;i<=12;i++)//依次遍历每个月的13日 { days+=dates[i-1]; if((days+w)%7==5) printf("%d\n",i); } } return0;}#include<stdio.h>intmain(){intw,i,sum,m;sum=13;scanf("%d",&w);if(w<=5)m=5-w;elsem=12-w;inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};for(i=1;i<=13;i++){sum=sum+a[i-1];if(sum%7==m+1) printf("%d\n",i); }return0;}参考程序2(程颖宇):#include<stdio.h>intmain(){ constintMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31}; inti,Day; while(scanf("%d",&Day)!=EOF){ Day+=11;//本来加上12就是13号的星期几的,但是这里用求余的办法确定星期几,也就是星期一是0,星期天是6,所以要减1 for(i=0;i<12;i++){ Day%=7; if(Day==4)printf("%d\n",i+1); Day+=Month[i]; } } return0;}CS47:特殊日历计算(来源:2967)问题描述:有一种特殊的日历法,它的一天和我们现在用的日历法的一天是一样长的。它每天有10个小时,每个小时有100分钟,每分钟有100秒。10天算一周,10周算一个月,10个月算一年。现在要你编写一个程序,将我们常用的日历法的日期转换成这种特殊的日历表示法。这种日历法的时、分、秒是从0开始计数的。日、月从1开始计数,年从0开始计数。秒数为整数。假设0:0:01.1.2000等同于特殊日历法的0:0:01.1.0。输入:第一行是一个正整数N,表明下面有N组输入。每组输入有一行,格式如下:hour:minut
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年秘书证考试核心技能试题及答案
- 收纳师考试认知试题与答案研究
- 牛顿运动定律的应用试题及答案
- 物体运动的相关定律:初中物理考试试题及答案
- 公务员道德素养试题及答案
- 土木工程基础与二级建造师试题及答案
- 2024年档案管理教育的创新与挑战试题及答案
- 2024年度公务员省考试题及答案解析
- 收纳师考试心得体会及总结试题及答案
- 全面掌握秘书证考试要点与试题及答案
- 上海杨浦区社区工作者考试真题2024
- 2024年烹饪与营养关系试题及答案
- 【公开课】语法填空真题分析及命题尝试课件-2025届高三英语二轮复习
- 形势与政策(2025春)超星尔雅学习通答案满分章节测试
- 国企集团公司各岗位廉洁风险点防控表格(廉政)范本
- ISO28000:2022供应链安全管理体系
- 2024年浪潮入职测评题和答案
- 门诊慢特病病种待遇认定申请表
- 全矿井风量测定及风表操作
- 中国历朝历代地图大全
- 重型货车制动器设计与整车特性计算
评论
0/150
提交评论