这一题坑比较多,不注意的话就只能拿80到90分,有点坑。
思路暴力搜索即可。
#include <iostream> #include <string> #include <vector> using namespace std; int monthd[13] = {31,28,31,30,31,31,30,31,30,31,30,31,29};//日期题目通用数组 int tf(int num){//判断是否回文数 string s; while(num>0){ s.push_back(num%10+'0'); num/=10; } if(s[0]==s[2]&&s[2]==s[5]&&s[5]==s[7]&&s[1]==s[3]&&s[3]==s[4]&&s[4]==s[6]){//特殊回文数,1成立也代表0成立。 return 1; } else if(s[0]==s[7]&&s[1]==s[6]&&s[2]==s[5]&&s[3]==s[4]){ return 0; } else return -1;//都不是返回-1; } int main(){ int N; cin>>N; int year = N/10000; int month = (N % 10000)/100; int day = N % 100; bool a = false,b = false; for(int i = year;i <= 10000; i++){//这里题目说明N<=8999但是答案不一定小于8999,要小心描述陷阱 for(int j = 1;j <= 12; j++){//月份 int k = monthd[j-1];//这里直接给天数赋值 if(year%4==0) k = monthd[12];//闰年2月取29天 for(int l = 1;l <= k; l++){ if(a&&b){//如果都找到了,直接return 0; return 0; } int ymd = i * 10000 + j * 100 + l; if(ymd==N)continue;//起点不能算进内 if(tf(ymd)==1&&!a){//找到特殊回文日期 a = true; cout<<ymd<<endl; if(!b){//假如b还没找到,一并输出 b = true; cout<<ymd<<endl; } } if(tf(ymd)==0&&!b){//普通的先找到 b = true; cout<<ymd<<endl; } } } } return 0; }
三个细节:
1、找到的数不能等于起点。
2、有可能普通的没找到先找到特殊的,这时候需要再补一个条件,将特殊的再输出一遍。
3、题目描述年份的范围和题解不同,要是没确定好边界就会少分。