问题描述
给定一个年份y和一个整数d,问这一年的第d天是几月几日?
注意闰年的2月有29天。满足下面条件之一的是闰年:
1) 年份是4的整数倍,而且不是100的整数倍;
2) 年份是400的整数倍。
输入格式
输入的第一行包含一个整数y,表示年份,年份在1900到2015之间(包含1900和2015)。
输入的第二行包含一个整数d,d在1至365之间。
输出格式
输出两行,每行一个整数,分别表示答案的月份和日期。
样例输入
2015
80
样例输出
3
21
样例输入
2000
40
样例输出
2
9
感悟: 总结:要学会自己设计测试用例,不然拿不到满分。
错因:特殊情况一开始没考虑到,提交只有80/90分,如下情况需注意:
测试用例一:
输入:
2019
59
容易错误的输出为
3
0
实际答案为
2
28
测试用例二:
输入:
2019
365
应该输出:
12
31
//201509-2日期计算
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int i,y,d,fmonth=0,fday=0;
int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
cin>>y>>d;
if((y%4==0 && y%100!=0)||y%400==0)
mon[2]+=1;
for(i=1;i<=12;i++)
{
if(d<=mon[i])
{
fday=d;
if(i==1) fmonth=1; //考虑正月情况
break;
}
else
{
d=d-mon[i];
fmonth=i+1;
}
}
cout<<fmonth<<endl<<fday<<endl;
return 0;
}
写法二:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int y,d,i,mon,sum=0,day;
int str[12]={31,28,31,30,31,30,31,31,30,31,30,31};
cin>>y;
cin>>d;
if((y%4==0 && y%100!=0) || y%400==0) //判断闰年
str[1]+=1;
int dd=d; //求月份
for(i=0;i<12;i++)
{
dd-=str[i];
if(dd<=0)
{
mon=i;
break;
}
}
for(i=0;i<mon;i++) //求第几天
{
sum+=str[i];
}
day=d-sum;
cout<<mon+1<<endl<<day;
return 0;
}