NC16438-回文日期
题目链接:https://ac.nowcoder.com/acm/problem/16438
给定两个日期a<b,求解在a到b中有多少个回文数,a和b格式为yyyymmdd,共8位。
思路1:裸暴力
#include<iostream>
using namespace std;
bool check(int x){
int l=x/10000;
int r=0;
for(int i=0;i<4;i++){
r=r*10+x%10;
x/=10;
}
//cout<<l<<" "<<r<<endl;
if(l==r)return true;
return false;
}
int main (){
int a,b;
cin>>a>>b;
int ans=0;
for(int i=a;i<=b;){
//cout<<i<<endl;
if(check(i))ans++;
int ad=i%100,am,ay;
i/=100;
am=i%100;
i/=100;
ay=i;
// cout<<ay<<" "<<am<<" "<<ad<<endl;
ad++;
if(ad>=28){
if(am==2){
if((ay%4==0&&ay%100!=0)||ay%400==0){
if(ad>29){
am++;
ad=1;
}
}
else if(ad>28){
am++;
ad=1;
}
}
else if(am==1||am==3||am==5||am==7||am==8||am==10||am==12){
if(ad>31){
am++;
ad=1;
}
}
else {
if(ad>30){
am++;
ad=1;
}
}
}
if(am==13){
am=1;
ay++;
}
i=ay*10000+am*100+ad;
}
cout<<ans;
return 0;
}
思路2:
遍历年判断生成的回文数满不满足条件 (也复杂点)
#include<iostream>
using namespace std;
int main (){
int a,b;
cin>>a>>b;
int ans=0;
for(int i=a/10000;i<=b/10000;i++){
int t=i;
int m=t%10;t/=10;
m=m*10+t%10;
t/=10;
int d=t%10;t/=10;
d=d*10+t%10;
if(m>12||m<=0)continue;
if(d>31||d<=0)continue;
if(m==6||m==4||m==9||m==11)
if(d>30)continue;
if(m==2){
if((i%4==0&&i%100!=0)||i%400==0){
if(d>29)continue;
}
else if(d>28)continue;
}
int s=i*10000+m*100+d;
if(s<a||s>b)continue;
ans++;
//cout<<i<<endl;
}
cout<<ans;
return 0;
}
思路3:
遍历月和日,判断生成的年满不满足条件
待补充

浙公网安备 33010602011771号