回文日期
题目 回文日期
思路分析
枚举每个数 取出合法日期 再对合法日期进行判断
判断是否回文可以用字符串 翻转比较
比如12344321 复制一份 翻转一下12344321 s1=s2
123231 复制一份 翻转一下 132321 s1≠s2
#include<bits/stdc++.h>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int year){
return year%100 && year%4==0 || year%400==0;
}
bool check_date(int year,int month,int day)
{
if(month==0 || month>12) return false;
if(day==0 || day>31) return false;
int cur_day=days[month];
if(month==2 && is_leap(year))
cur_day++;
if(day>cur_day)
return false;
return true;
}
int main()
{
int stdate,eddate;
cin>>stdate>>eddate;
int cnt=0;
for(int date=stdate;date<=eddate;date++){
int year=date/10000,month=date%10000/100,day=date%100;
if(check_date(year,month,day)){
string s1=to_string(date);
string s2=s1;
reverse(s2.begin(),s2.end());
if(s1==s2)
cnt++;
}
}
cout<<cnt;
return 0;
}
居然超时了 来听一下y总怎么写 感觉这个已经很巧妙了啊
时间主要是浪费在了枚举合法日期上
可以换个枚举顺序 先枚举可能的回文串 再检查它是否是合法日期
yyyymmdd 要让它回文 意味着mmdd要等于yyyy 这意味着 如果确定了yyyy 就可以确定mmdd
所以枚举年份即可 构造相应的回文日期 然后再判断这个日期是否合法
妙上加妙
代码实现
#include<bits/stdc++.h>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool is_leap(int year){
return year%100 && year%4==0 || year%400==0;
}
bool check_date(int year,int month,int day)
{
if(month==0 || month>12) return false;
if(day==0 || day>31) return false;
int cur_day=days[month];
if(month==2 && is_leap(year))
cur_day++;
if(day>cur_day)
return false;
return true;
}
int main()
{
int stdate,eddate;
cin>>stdate>>eddate;
int cnt=0;
for(int year=stdate/10000;year<=eddate/10000;year++){
string left=to_string(year);
string right=left;
reverse(right.begin(),right.end());
// string yearstr=left+right;
int month=stoi(right.substr(0,2));
int day=stoi(right.substr(2,2));
int date=year*10000+month*100+day;
if(date>=stdate && date<=eddate)
if(check_date(year,month,day))
cnt++;
}
cout<<cnt;
return 0;
}
💬 评论