题解 | #[NOIP2016]回文日期#
[NOIP2016]回文日期
https://ac.nowcoder.com/acm/problem/16438
#include using namespace std; int main() { int a, b,js=0; int month[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int y1,y2,m2,d1,d2; cin>>a>>b; y1=a/10000,y2=b/10000,m2=b/100%100,d1=a%100,d2=b%100; for(int i=1;i<13;i++) for(int j=1;j<=month[i];j++) { int sum=(j%10*10+j/10)100+i%1010+i/10%10; if(sum>=y1&&sum<y2) {
js++;
}
else
if((sum==y2&&m2>i)||(sum==y2&&m2==i&&d2>=j))
{
js++;
}
}
cout<<js;
}
通过模拟枚举日月所对应的回文年份判断其是否符合输入的日期区间,其中sum的产生无论枚举的日期是否是个位数还是十位数,其方法都能完成,年份枚举出来后可能会在年份相等的情况下月份超过输入的区间,所以另起一个if((sum==y2&&m2>i)||(sum==y2&&m2==i&&d2>=j))判断年相同:1.月份小于一年,天数无关2.月份等于最后一年,其天数必须小于等于最后一天 可优化之处:可以直接生成回文年sum后10000再加上枚举的日期(i100+j)