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;
}
经典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;
}
相关文章推荐
- LightOJ - 1414 February 29 (日期模拟)有多少个2月29
- lightoj 1414 February 29
- Lightoj 1414 - February 29 (闰年统计,容斥定理)
- LIGHTOJ 1414 - February 29【Leap】
- lightoj 1414 - February 29
- LightOj 1414 1414 - February 29
- 【Lightoj 1414 - February 29 】
- Lightoj 1414 - February 29
- 【LightOJ】1414 - February 29(容斥原理)
- lightoj-1414-February 29【容斥原理&&细节】
- Light OJ-----1414---February 29
- light oj 1414 - February 29
- Light 1414-February 29【容斥定理】
- 【Light OJ 1414】February 29(容斥原理)
- Lingt oj 1414 - February 29
- Light oj 1414 - February 29【容斥原理】
- 求一个数的二进制中有多少个1的两种解法
- 【Light-oj】-1414 - February 29(容斥原理)
- java 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 统计某个文件中出现的字符个数,数字个数,空格个数,总共有多少行?