この問題には落とし穴がたくさんありますが、注意しないと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;
}
3 つの詳細:
1. 見つかった数が開始点と同じであってはなりません。
2. 共通のものを見つける前に特殊なものを見つけることができます. このとき、条件を追加して特殊なものを再度出力する必要があります.
3. タイトルの説明年の範囲は、タイトルのソリューションとは異なります. 境界が決定されていない場合, 減点されます.