CCF201509-2 日期计算
题目:
题目分析:
求某年第n天是该年的几月几日,需要特殊处理闰年情况。
为了程序设计方便,使用数组a[]依次存储每个月前一天是一年第几天,使用数组b[]存储每一月有多少天。
对于输入的第n天,遍历数组a[]找到一个比它大的数,则此时下标对应的便是年份m,天数等于d=n-a[m-1],这里需要处理d=0的特殊情况。
闰年且大于2月的情况,都要减一天,如果是每个月第一天则需要减为上一个月最后一天。
代码如下:
//ccf201509-2 日期计算
#include<iostream>
using namespace std;
//数组a[]依次存储每个月前一天是一年第几天
int a[15]={0,31,59,90,120,151,181,212,243,273,304,334,367};
//数组b[]存储每一月有多少天
int b[15]={31,29,31,30,31,30,31,31,30,31,30,31};
//y,m,d,n_分别表示年,月,日,该年第几天,flag标志是否为闰年
int n,y,m,d,flag;
int main(){
cin>>y>>n;
if((y%400==0)||((y%4==0)&&(y%100!=0)))flag=1; //判断是否为闰年
for(m=0;;m++) //找到月份
if(n<a[m])break;
d=n-a[m-1];
if(d==0){ //处理减完为第0天的情况
m--;d=b[m-1];
if(d==29)d=28; //2月特殊处理
}
if(flag==1&&m>2){ //处理闰年情况,月份大于2,都要减一天
if(d==1){ m--;d=b[m-1]; } //每个月的第一天需要减为上一个月最后一天
else d--; //其他情况,只需要减一天
}
cout<<m<<endl<<d<<endl; //输出
return 0;
}