您的位置:首页 > Web前端

LightOJ-1414-February 29--总共多少个闰日?--两种解法

2017-07-21 16:55 441 查看
题目链接https://vjudge.net/problem/LightOJ-1414

经典C语言题。大致意思是输入两个日期,输出包含两个日期在内的有多少个闰日。

Sample Input

4

January 12, 2012

March 19, 2012

August 12, 2899

August 12, 2901

August 12, 2000

August 12, 2005

February 29, 2004

February 29, 2012

Sample Output

Case 1: 1

Case 2: 0

Case 3: 1

Case 4: 3

方法一:(耗时长,超时,但思想中规中矩)

1、定义月份数组,写一个查找月份的函数。

2、每个年份分别判断是否是闰年

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
char month[][20]={"January", "February", "March", "April", "May
4000
", "June",
"July", "August", "September", "October", "November", "December"};
int find_month(char m[]){
for(int i=0;i<12;i++){
if(strcmp(m,month[i])==0)
return i+1;
}
return 0;
}
bool leap(int year){
if((year%4==0&&year%100!=0)||year%400==0) return true;
return false;
}
int main(){
int T,day1,year1,day2,year2,kase=0;
char temp1[20],temp2[20];
scanf("%d",&T);
while(T--){
int cnt=0;
scanf("%s %d, %d",temp1,&day1,&year1);
scanf("%s %d, %d",temp2,&day2,&year2);
int month1=find_month(temp1),month2=find_month(temp2);
//printf("%d %d %d %d %d %d\n",year1,month1,day1,year2,month2,day2);
if(leap(year1)){
if(month1<=2) cnt++;
}
for(int i=year1+1;i<year2;i++){
//printf("%d\n",leap(i));
if(leap(i)) cnt++;
}
if(year2!=year1&&leap(year2)){
if(month2>2) cnt++;
else if(month2==2&&day2==29) cnt++;
}
printf("Case %d: %d\n",++kase,cnt);
}
return 0;
}


方法二:
方法一就是最原始的思想,第一个年份判断一下,中间每个年份判断一下,最后一个年份判断一下。但是提交上去超时。

1、对方法一中的第一点,查找月份,我们可以不用strcmp函数,只用判断每个月份前两个字母就行。这函数费时。

2、对方法一中的第二点,查找总共的闰年数,我们可以不用每个年份单独判断。这里介绍一个方法cnt=(year2/4-year2/100+year2/400)-(year1/4-year1/100+year1/400);意思就是查找年份为year1+1,year1+2,...,year2的闰年的个数。比如year1=2000,year2=2004,那么cnt=1。

对这两点优化之后,代码符合要求。如下:

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
bool leap(int year){
if((year%4==0&&year%100!=0)||year%400==0) return true;
return false;
}
int main(){
int T,day1,year1,day2,year2,kase=0;
char month1[20],month2[20];
scanf("%d",&T);
while(T--){
scanf("%s %d, %d",month1,&day1,&year1);
scanf("%s %d, %d",month2,&day2,&year2);
int cnt=(year2/4-year2/100+year2/400)-(year1/4-year1/100+year1/400);
if(leap(year1)){
if(month1[0]=='J'&&month1[1]=='a'||month1[0]=='F') cnt++;
}
if(leap(year2)){
if(month2[0]=='J'&&month2[1]=='a'||month2[0]=='F'&&day2<29) cnt--;
}
printf("Case %d: %d\n",++kase,cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: