输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出m行,每行按yyyy-mm-dd的个数输出。
#include<cstdio>//判断是否是闰年
bool isLeap(int year){return (year%4==0&&year%100!=0)||year%400==0;
}//用二维数组存平年和闰年每个月的天数,[i][0]为平年,[i][1]为闰年
int monthDay[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}}; int main(){int n,yy,mm,dd,inc;scanf("%d",&n);while(n--){scanf("%d%d%d%d",&yy,&mm,&dd,&inc);while(inc--){dd++;if(isLeap(yy)){if(dd==monthDay[mm][1]+1){dd=1;mm++;}}else{if(dd==monthDay[mm][0]+1){dd=1;mm++;}}if(mm==13){mm=1;yy++;} }printf("%d-%02d-%02d\n",yy,mm,dd);}return 0;
}
收获:
①让日期不断加一的新颖思路
②月份的二维数组
③判断是否到下一个月的方法dd==monthDay[mm][0]+1
和这个题一母同胞的还有计算日期差值(同一天算做1)
注意:输入的第一个日期未必早于第二个,需要进行判断,必要时交换两个日期
#include<cstdio>
#include<cstring>
#include<cmath>int daysInMonth[2][13] = {{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};void swap(int* p1,int* p2){int temp = *p1;*p1 = *p2;*p2 = temp;
}int isLeap(int year){//如果是闰年,返回1 ,否则返回0 if((year%4 == 0 && year%100 != 0)||(year%400 == 0)){return 1;}else{return 0;}
}int main(){int st,nd; scanf("%d%d",&st,&nd);if(st>nd){//如果第一个日期比第二个迟,则交换它俩 int* p = &st;int* q = &nd;swap(p,q);}
// printf("%d %d",st,nd);int y1,m1,d1,y2,m2,d2;y1 = st/10000;m1 = st%10000/100;d1 = st%100;y2 = nd/10000;m2 = nd%10000/100;d2 = nd%100;int ans = 1;while(!((y1 == y2)&&(m1 == m2)&&(d1 == d2))){d1 ++;if(d1 == daysInMonth[isLeap(y1)][m1]){m1 ++;d1 = 1;}if(m1 == 13){y1 ++;m1 = 1;}ans ++;}printf("%d\n",ans);return 0;}